开始写svgalib接口
This commit is contained in:
parent
57e26b8fca
commit
0d85671e6d
Binary file not shown.
|
@ -1,4 +1,4 @@
|
|||
all:
|
||||
gcc page.h fbtool.h fbtool.c test.c -o test
|
||||
arm-linux-gnueabihf-gcc page.h fbtool.h fbtool.c test.c -o test_fb5
|
||||
clean:
|
||||
rm test
|
||||
|
|
Binary file not shown.
|
@ -1,4 +1,4 @@
|
|||
all:
|
||||
gcc page.h fbtool.h fbtool.c test.c -o test -lm
|
||||
arm-linux-gnueabihf-gcc page.h fbtool.h fbtool.c test.c -o test_fb6 -lm
|
||||
clean:
|
||||
rm test
|
||||
|
|
10
fb6/test.c
10
fb6/test.c
|
@ -12,7 +12,7 @@ int main()
|
|||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
//打印frame buffer 所占内存的开始地址
|
||||
pmem_start(&fbdev);
|
||||
//打印FB_TYPE
|
||||
|
@ -35,7 +35,7 @@ int main()
|
|||
getchar();
|
||||
|
||||
//清屏
|
||||
clear_con(fbdev.fb_mem + fbdev.fb_mem_offset,-1,fbdev.fb_fix.smem_len); */
|
||||
clear_con(fbdev.fb_mem + fbdev.fb_mem_offset,-1,fbdev.fb_fix.smem_len);
|
||||
|
||||
|
||||
POINT p;
|
||||
|
@ -43,7 +43,7 @@ int main()
|
|||
p.y = 100;
|
||||
//画点
|
||||
draw_x_y_dot(&fbdev,100,100,0x0,0xff,0x0);
|
||||
/*
|
||||
|
||||
RGBT c;
|
||||
c.r = 0xff;
|
||||
c.g = 0xff;
|
||||
|
@ -82,7 +82,7 @@ int main()
|
|||
p42.x = 120;
|
||||
p42.y = 160;
|
||||
POINT p43;
|
||||
p43.x = 160;
|
||||
p43.x = 16;
|
||||
p43.y = 160;
|
||||
//画矩形
|
||||
draw_rec(&fbdev,p40,p42,p41,p43,0x0,0xff,0x0);
|
||||
|
@ -100,7 +100,7 @@ int main()
|
|||
p53.x = 160;
|
||||
p53.y = 220;
|
||||
//填充矩形
|
||||
fill_rec(&fbdev,p50,p52,p51,p53,0x0,0xff,0x0);*/
|
||||
fill_rec(&fbdev,p50,p52,p51,p53,0x0,0xff,0x0);
|
||||
|
||||
//draw_circle(&fbdev,500,400,100,RED);
|
||||
|
||||
|
|
Binary file not shown.
14
fb7/Makefile
14
fb7/Makefile
|
@ -1,15 +1,15 @@
|
|||
objects = fbtool.o point.o line.o rectangle.o circle.o
|
||||
test : test.c $(objects)
|
||||
gcc test.c $(objects) -o test -lm
|
||||
arm-linux-gnueabihf-gcc test.c $(objects) -o test_fb7 -lm
|
||||
fbtool.o : page.h color.h fbtool.h fbtool.c
|
||||
gcc -c page.h color.h fbtool.h fbtool.c
|
||||
arm-linux-gnueabihf-gcc -c page.h color.h fbtool.h fbtool.c
|
||||
point.o : fbtool.h point.h point.c
|
||||
gcc -c fbtool.h point.h point.c
|
||||
arm-linux-gnueabihf-gcc -c fbtool.h point.h point.c
|
||||
line.o : fbtool.h point.h line.h line.c
|
||||
gcc -c fbtool.h point.h line.h line.c
|
||||
arm-linux-gnueabihf-gcc -c fbtool.h point.h line.h line.c
|
||||
rectangle.o : fbtool.h point.h line.h rectangle.h rectangle.c
|
||||
gcc -c fbtool.h point.h line.h rectangle.h rectangle.c
|
||||
arm-linux-gnueabihf-gcc -c fbtool.h point.h line.h rectangle.h rectangle.c
|
||||
circle.o : fbtool.h point.h circle.h circle.c
|
||||
gcc -c fbtool.h point.h circle.h circle.c -lm
|
||||
arm-linux-gnueabihf-gcc -c fbtool.h point.h circle.h circle.c -lm
|
||||
clean:
|
||||
rm *.o *.gch test
|
||||
\rm *.o *.gch test test_fb7
|
||||
|
|
14
fb7/test.c
14
fb7/test.c
|
@ -15,7 +15,7 @@ int main()
|
|||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
//打印frame buffer 所占内存的开始地址
|
||||
pmem_start(&fbdev);
|
||||
//打印FB_TYPE-c kbd.c
|
||||
|
@ -38,14 +38,14 @@ int main()
|
|||
getchar();
|
||||
|
||||
//清屏
|
||||
clear_con(fbdev.fb_mem + fbdev.fb_mem_offset,-1,fbdev.fb_fix.smem_len); */
|
||||
clear_con((void *)(fbdev.fb_mem + fbdev.fb_mem_offset),-1,fbdev.fb_fix.smem_len);
|
||||
|
||||
|
||||
POINT p;
|
||||
p.x = 100;
|
||||
p.y = 100;
|
||||
|
||||
/*
|
||||
|
||||
//画点
|
||||
draw_x_y_dot(&fbdev,100,100,0x0,0xff,0x0);
|
||||
|
||||
|
@ -105,8 +105,8 @@ int main()
|
|||
p53.x = 160;
|
||||
p53.y = 220;
|
||||
//填充
|
||||
fill_rec(&fbdev,p50,p52,p51,p53,0x0,0xff,0x0);*/
|
||||
|
||||
fill_rec(&fbdev,p50,p52,p51,p53,0x0,0xff,0x0);
|
||||
/*
|
||||
int x = 500;
|
||||
while(1){
|
||||
draw_circle(&fbdev,x,400,100,RED);
|
||||
|
@ -117,10 +117,10 @@ int main()
|
|||
if(x == 1200)
|
||||
break;
|
||||
|
||||
clear_con(fbdev.fb_mem + fbdev.fb_mem_offset,1,fbdev.fb_fix.smem_len);
|
||||
clear_con((void *)(fbdev.fb_mem + fbdev.fb_mem_offset),1,fbdev.fb_fix.smem_len);
|
||||
|
||||
}
|
||||
|
||||
*/
|
||||
fb_close(&fbdev);
|
||||
|
||||
return 0;
|
||||
|
|
Binary file not shown.
|
@ -0,0 +1,25 @@
|
|||
srcdir = $(shell sh -c pwd)
|
||||
prefix = /export/imx6/rootfs/rootfs-mx6g2c-new-nand/usr/local/test
|
||||
|
||||
CC = arm-linux-gnueabihf-gcc
|
||||
|
||||
objects = fbtool.o point.o line.o rectangle.o circle.o
|
||||
frist:clean test
|
||||
test : test.c $(objects)
|
||||
$(CC) test.c $(objects) -o test_fb7 -lm
|
||||
fbtool.o : page.h color.h fbtool.h fbtool.c
|
||||
$(CC) -c page.h color.h fbtool.h fbtool.c
|
||||
point.o : fbtool.h point.h point.c
|
||||
$(CC) -c fbtool.h point.h point.c
|
||||
line.o : fbtool.h point.h line.h line.c
|
||||
$(CC) -c fbtool.h point.h line.h line.c
|
||||
rectangle.o : fbtool.h point.h line.h rectangle.h rectangle.c
|
||||
$(CC) -c fbtool.h point.h line.h rectangle.h rectangle.c
|
||||
circle.o : fbtool.h point.h circle.h circle.c
|
||||
$(CC) -c fbtool.h point.h circle.h circle.c -lm
|
||||
.PHONY:clean install all
|
||||
clean:
|
||||
@rm -fv *.o *.gch test_fb7
|
||||
install: clean test
|
||||
@cp -vf $(srcdir)/test_fb7 $(prefix)
|
||||
@chmod 777 $(prefix)/test_fb7
|
|
@ -0,0 +1,84 @@
|
|||
**(一):写在前面**
|
||||
|
||||
这一次没有进行功能上的改进,主要是为了后来修改方便,而将画点,画线,画长方形,画圆等的提取出来,对Makefile进行了修改,方便于后期的维护.同时,为了后面实现我的思路,我进行了一个测试,就是实现一个运动的圆的效果.圆是可以运动了,但是效果不是特别好.后面再了解一下图形化界面是怎么实现的.我再试一下别的思路.
|
||||
|
||||
|
||||
**(二):功能介绍**
|
||||
|
||||
*1:Makefile文件的修改*
|
||||
|
||||
```
|
||||
objects = fbtool.o point.o line.o rectangle.o circle.o
|
||||
test : test.c $(objects)
|
||||
gcc test.c $(objects) -o test -lm
|
||||
fbtool.o : page.h color.h fbtool.h fbtool.c
|
||||
gcc -c page.h color.h fbtool.h fbtool.c
|
||||
point.o : fbtool.h point.h point.c
|
||||
gcc -c fbtool.h point.h point.c
|
||||
line.o : fbtool.h point.h line.h line.c
|
||||
gcc -c fbtool.h point.h line.h line.c
|
||||
rectangle.o : fbtool.h point.h line.h rectangle.h rectangle.c
|
||||
gcc -c fbtool.h point.h line.h rectangle.h rectangle.c
|
||||
circle.o : fbtool.h point.h circle.h circle.c
|
||||
gcc -c fbtool.h point.h circle.h circle.c -lm
|
||||
clean:
|
||||
rm *.o *.gch test
|
||||
```
|
||||
|
||||
*2:测试实现圆的运动*
|
||||
|
||||
```
|
||||
int x = 500;
|
||||
while(1){
|
||||
draw_circle(&fbdev,x,400,100,RED);
|
||||
usleep(100);
|
||||
|
||||
x++;
|
||||
|
||||
if(x == 1200)
|
||||
break;
|
||||
|
||||
clear_con(fbdev.fb_mem + fbdev.fb_mem_offset,1,fbdev.fb_fix.smem_len);
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
这次测试暂时是这样实现的,不过界面的刷新和图形的运动是在同时发生的,也就是说是同一个频率的.这样是不行的.就会出现闪频的问题.后面我将修改这个,初步思路是将界面刷新放到一个单独的线程当中,或者是根据时钟来刷新,这个后面再说吧.
|
||||
|
||||
**(三):后期规划**
|
||||
|
||||
后面的话主要的想法就是先实现图形的刷新,让图形能够移动或者是使图形能够一直存在.完成这个之后,就是纯图形库的编写工作了.
|
||||
|
||||
|
||||
**(四):写在后面**
|
||||
|
||||
众里寻他千百度,蓦然回首,那人却在灯火阑珊处.
|
||||
|
||||
<video id="video" controls="" preload="none" poster="http://media.w3.org/2010/05/sintel/poster.png">
|
||||
<source id="mp4" src="./video.mp4" type="video/mp4">
|
||||
</video>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
#include "circle.h"
|
||||
|
||||
//画圆
|
||||
void draw_circle(PFBDEV pFbdev,int x,int y,int radius,const char *color)
|
||||
{
|
||||
double i;
|
||||
|
||||
int tmp;
|
||||
|
||||
for(i = x - radius; i < x + radius;i+=0.01){
|
||||
tmp = sqrt(radius * radius - (i - x) * (i - x));
|
||||
|
||||
draw_x_y_color_dot_with_string(pFbdev,i,(tmp + y),color);
|
||||
draw_x_y_color_dot_with_string(pFbdev,i,(-tmp + y),color);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
* 画圆或者是填充圆的实现
|
||||
* @作者 陈洪波
|
||||
*/
|
||||
|
||||
#ifndef _CIRCLE_H_
|
||||
#define _CIRCLE_H_
|
||||
|
||||
#include "fbtool.h"
|
||||
#include "point.h"
|
||||
#include <math.h>
|
||||
|
||||
/*
|
||||
* 画一个圆
|
||||
* @param pFbdev 参考结构体 fbdev
|
||||
* @param x 圆的圆心所在的点的x值
|
||||
* @param y 圆的圆心所在的点的y值
|
||||
* @param radius 圆的半径的长度
|
||||
* @color 代表颜色的字符串
|
||||
* @return void
|
||||
*/
|
||||
void draw_circle(PFBDEV pFbdev,int x,int y,int radius,const char *color);
|
||||
|
||||
#endif //_CIRCLE_H_
|
|
@ -0,0 +1,61 @@
|
|||
#ifndef _COLOR_H_
|
||||
#define _COLOR_H_
|
||||
|
||||
|
||||
#include <stdint.h>
|
||||
/**
|
||||
* 代表颜色的结构体
|
||||
* @property r 颜色对应的R值
|
||||
* @property g 颜色对应的G值
|
||||
* @property b 颜色对应的B值
|
||||
* @property t 颜色对应的T值
|
||||
*/
|
||||
typedef struct rgbt{
|
||||
uint8_t r;
|
||||
uint8_t g;
|
||||
uint8_t b;
|
||||
uint8_t t;
|
||||
}RGBT;
|
||||
|
||||
//定义一些常用的颜色属性
|
||||
|
||||
#define COLOR16(r, g, b) (((r)&0x1F) << 11 | ((g)&0x1F) << 6 | ((b)&0x3F))
|
||||
|
||||
#define BLACK COLOR16(0, 0, 0) // 0 BLACK (masked write)
|
||||
#define BLUE COLOR16(0, 0, 15) // 1 BLUE
|
||||
#define GREEN COLOR16(0, 15, 0) // 2 GREEN
|
||||
#define CYAN COLOR16(0, 15, 15) // 3 CYAN
|
||||
#define RED COLOR16(15, 0, 0) // 4 RED
|
||||
#define MAGENTA COLOR16(15, 0, 15) // 5 MAGENTA
|
||||
#define BROWN COLOR16(15, 15, 0) // 6 BROWN
|
||||
#define LT_GRAY COLOR16(24, 24, 24) // 7 LT_GRAY wallpaper
|
||||
#define DT_GRAY COLOR16(12, 12, 12) // 8 DT_GRAY
|
||||
#define LT_BLUE COLOR16(0, 0, 31) // 9 LT_BLUE set_text
|
||||
#define LT_GREEN COLOR16(0, 31, 0) // 10 LT_GREEN
|
||||
#define LT_CYAN COLOR16(0, 31, 31) // 11 LT_CYAN
|
||||
#define LT_RED COLOR16(31, 0, 0) // 12 LT_RED
|
||||
#define LT_MAGENTA COLOR16(31, 0, 31) // 13 LT_MAGENTA
|
||||
#define YELLOW COLOR16(31, 31, 0)
|
||||
// 14 YELLOW err_message/act_text/err_win/icon/(clk_sec_hd)
|
||||
#define WHITE COLOR16(31, 31, 31) // 15 WHITE
|
||||
//#define COLOR16(1, 1, 1) // 16 BLACK (cheat putboxmask
|
||||
// routine)
|
||||
//#define COLOR16(4, 12, 12) // 17 frame
|
||||
//#define COLOR16(12, 22, 26) // 18 sel_window / pointer /
|
||||
//(clk_bg)
|
||||
//#define COLOR16(21, 24, 22) // 19 key/page/dummy/graphic/gray_text
|
||||
//#define COLOR16(9, 10, 10) // 20 key_fg / graphic_sh / pointer_sh
|
||||
//#define COLOR16(0, 8, 0) // 21 curve1_color / breakdown 4th
|
||||
// color
|
||||
//#define COLOR16(18, 8, 12) // 22 curve2_color / breakdown
|
||||
//5th
|
||||
// color
|
||||
//#define COLOR16(31, 5, 27) // 23 curve3_color
|
||||
//#define COLOR16(22, 6, 6) // 24 err_win_icon/breakdown 1st color
|
||||
//#define COLOR16(31, 22, 22) // 25 rev_set_text_bg / hp_window
|
||||
//#define COLOR16(31, 13, 17) // 26 curve4_color / (well_text) /
|
||||
//(well_logo)
|
||||
//#define COLOR16(7, 14, 20) // 27 win_sh
|
||||
//#define COLOR16(31, 15, 3) // 28 Amber (Yellow + Orange)
|
||||
|
||||
#endif //_COLOR_H_
|
|
@ -0,0 +1,206 @@
|
|||
#include "fbtool.h"
|
||||
#include <fcntl.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/mman.h>
|
||||
#include <unistd.h>
|
||||
|
||||
FBDEV currFbdev;
|
||||
|
||||
//打开并且初始化该frame buffer
|
||||
int fb_open(char * sFbdev)
|
||||
{
|
||||
memset(&currFbdev, 0, sizeof(FBDEV));
|
||||
strcpy(currFbdev.dev, sFbdev);
|
||||
|
||||
//打开frame buffer
|
||||
currFbdev.fb = open(currFbdev.dev, O_RDWR);
|
||||
|
||||
if (currFbdev.fb < 0) {
|
||||
printf("打开错误 %s.请检查内核配置\n", currFbdev.dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 初始化fb_var
|
||||
if(-1 == ioctl(currFbdev.fb,FBIOGET_VSCREENINFO,&(currFbdev.fb_var)))
|
||||
{
|
||||
printf("ioctl FBIOGET_VSCREENINFO\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 初始化fb_fix
|
||||
if(-1 == ioctl(currFbdev.fb,FBIOGET_FSCREENINFO,&(currFbdev.fb_fix)))
|
||||
{
|
||||
printf("ioctl FBIOGET_FSCREENINFO\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
//将物理地址映射到虚拟地址
|
||||
currFbdev.fb_mem_offset = (unsigned long)currFbdev.fb_fix.smem_start & (~PAGE_MASK);
|
||||
|
||||
currFbdev.fb_mem = (unsigned long int)mmap(NULL,currFbdev.fb_fix.smem_len + currFbdev.fb_mem_offset,PROT_READ|PROT_WRITE,MAP_SHARED,currFbdev.fb,0);
|
||||
|
||||
if(-1L == (long)currFbdev.fb_mem){
|
||||
printf("mmap error with mem:%lu,mem_offset:%lu\n",currFbdev.fb_mem_offset,currFbdev.fb_mem);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
//关闭frame buffer
|
||||
int fb_close(PFBDEV pFbdev)
|
||||
{
|
||||
int r = close(currFbdev.fb);
|
||||
currFbdev.fb = -1;
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
//打印frame buffer 所占内存的开始地址
|
||||
void pmem_start(PFBDEV pFbdev)
|
||||
{
|
||||
printf("frame buffer所占内存的开始地址为:%lu\n",currFbdev.fb_fix.smem_start);
|
||||
}
|
||||
|
||||
//打印FB_TYPE
|
||||
void p_type(PFBDEV pFbdev)
|
||||
{
|
||||
printf("frame buffer 的类型为:%d\n",currFbdev.fb_fix.type);
|
||||
}
|
||||
|
||||
//打印可见清晰度
|
||||
void p_visible_res(PFBDEV pFbdev)
|
||||
{
|
||||
printf("frame buffer的可见清晰度为:\n\tx = %d\n\ty = %d\n",currFbdev.fb_var.xres,currFbdev.fb_var.yres);
|
||||
}
|
||||
|
||||
//打印虚拟分辨率
|
||||
void p_virt_res(PFBDEV pFbdev)
|
||||
{
|
||||
printf("frame buffer的虚拟清晰度为:\n\tx = %d\n\ty = %d\n",currFbdev.fb_var.xres_virtual,currFbdev.fb_var.yres_virtual);
|
||||
}
|
||||
|
||||
//打印虚拟到可见的偏移量
|
||||
void p_offset(PFBDEV pFbdev)
|
||||
{
|
||||
printf("frame buffer的虚拟分辨率到可见分辨率的偏移量为:\n\tx = %d\n\ty = %d\n",currFbdev.fb_var.xoffset,currFbdev.fb_var.yoffset);
|
||||
}
|
||||
|
||||
//打印每个像素的位数
|
||||
void p_bpp(PFBDEV pFbdev)
|
||||
{
|
||||
printf("frame buffer的BPP为:%d\n",currFbdev.fb_var.bits_per_pixel);
|
||||
}
|
||||
|
||||
//打印R,G,B和透明度
|
||||
void p_rgbt(PFBDEV pFbdev)
|
||||
{
|
||||
//R位域
|
||||
printf("R位域:\n");
|
||||
struct fb_bitfield bf = currFbdev.fb_var.red;
|
||||
printf("\t开始:%d\n",bf.offset);
|
||||
printf("\t长度:%d\n",bf.length);
|
||||
printf("\tMSB:%d\n",bf.msb_right);
|
||||
|
||||
//G位域
|
||||
printf("G位域:\n");
|
||||
bf = currFbdev.fb_var.green;
|
||||
printf("\t开始:%d\n",bf.offset);
|
||||
printf("\t长度:%d\n",bf.length);
|
||||
printf("\tMSB:%d\n",bf.msb_right);
|
||||
|
||||
// B位域
|
||||
printf("B位域:\n");
|
||||
bf = currFbdev.fb_var.blue;
|
||||
printf("\t开始:%d\n",bf.offset);
|
||||
printf("\t长度:%d\n",bf.length);
|
||||
printf("\tMSB:%d\n",bf.msb_right);
|
||||
|
||||
// 透明度位域
|
||||
printf("透明度位域:\n");
|
||||
bf = currFbdev.fb_var.transp;
|
||||
printf("\t开始:%d\n",bf.offset);
|
||||
printf("\t长度:%d\n",bf.length);
|
||||
printf("\tMSB:%d\n",bf.msb_right);
|
||||
}
|
||||
|
||||
//打印在内存中的高度和宽度
|
||||
void p_hw(PFBDEV pFbdev)
|
||||
{
|
||||
printf("frame buffer在内存中所占的高度和宽度分别是:\n\t宽度 = %d\n\t高度 = %d\n",currFbdev.fb_var.height,currFbdev.fb_var.width);
|
||||
}
|
||||
|
||||
//清空控制台
|
||||
void clear_con(void *addr,int n,size_t len)
|
||||
{
|
||||
memset(addr,n,len);
|
||||
}
|
||||
|
||||
//映射到内存
|
||||
void inline fb_memcpy(void *addr,void *color,size_t len)
|
||||
{
|
||||
memcpy(addr,color,len);
|
||||
}
|
||||
|
||||
RGBT getRGBT(const char *temp){
|
||||
RGBT rgbt;
|
||||
|
||||
char *c_tmp;
|
||||
c_tmp = (char *)malloc(4 * sizeof(int));
|
||||
|
||||
c_tmp[0] = '0';
|
||||
c_tmp[1] = 'x';
|
||||
int r,g,b,t;
|
||||
|
||||
//RGBT值的计算
|
||||
c_tmp[2] = temp[0];
|
||||
c_tmp[3] = temp[1];
|
||||
|
||||
r = strtol(c_tmp,NULL,16);
|
||||
|
||||
c_tmp[2] = temp[2];
|
||||
c_tmp[3] = temp[3];
|
||||
|
||||
g = strtol(c_tmp,NULL,16);
|
||||
|
||||
c_tmp[2] = temp[4];
|
||||
c_tmp[3] = temp[5];
|
||||
|
||||
b = strtol(c_tmp,NULL,16);
|
||||
|
||||
c_tmp[2] = temp[6];
|
||||
c_tmp[3] = temp[7];
|
||||
|
||||
t = strtol(c_tmp,NULL,16);
|
||||
|
||||
rgbt.r = r;
|
||||
rgbt.g = g;
|
||||
rgbt.b = b;
|
||||
rgbt.t = t;
|
||||
|
||||
return rgbt;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,154 @@
|
|||
#ifndef __FBTOOL_H_
|
||||
#define __FBTOOL_H_
|
||||
|
||||
#include <linux/fb.h>
|
||||
#include "page.h"
|
||||
#include "color.h"
|
||||
|
||||
/**
|
||||
* 该结构体主要是定义了一组保存frame buffer的属性
|
||||
* @property fb frame buffer打开后的唯一标识符
|
||||
* @property fb_fix frame buffer的固定属性就保存在这个结构体中
|
||||
* @property fb_var frame buffer的可变属性保存在这个结构体中
|
||||
* @property fb_mem_offset frame buffer所占内存的偏移量
|
||||
* @property fb_mem frame buffer的映射到进程内存空间的起始地址
|
||||
*/
|
||||
typedef struct fbdev{
|
||||
int fb;
|
||||
struct fb_fix_screeninfo fb_fix;
|
||||
struct fb_var_screeninfo fb_var;
|
||||
/* 新增 */
|
||||
unsigned long fb_mem_offset;
|
||||
unsigned long fb_mem;
|
||||
|
||||
char dev[20];
|
||||
} FBDEV, *PFBDEV;
|
||||
|
||||
extern FBDEV currFbdev;
|
||||
|
||||
/**
|
||||
* 该结构体用于定位点的位置,包括横坐标,纵坐标,深坐标
|
||||
* @property x 横坐标
|
||||
* @property y 纵坐标
|
||||
* @property z 深坐标(这个用于3D)
|
||||
*/
|
||||
typedef struct point{
|
||||
int x;
|
||||
int y;
|
||||
int z;
|
||||
}POINT,*PPOINT;
|
||||
|
||||
/*
|
||||
* 该函数用于打开frame buffer
|
||||
* @param sFbdev 设备名,如"/dev/fb0"
|
||||
* @return 0 - 打开失败
|
||||
* 1 - 打开成功
|
||||
*/
|
||||
int fb_open(char *sFbdev);
|
||||
|
||||
/*
|
||||
* 该函数用于关闭frame buffer设备
|
||||
* @param pFbdev 参照结构体 fbdev
|
||||
* @return 0 - 关闭成功
|
||||
* >0 - 关闭失败
|
||||
*/
|
||||
int fb_close(PFBDEV pFbdev);
|
||||
|
||||
/*
|
||||
* 该函数用于打印frame buffer 所占内存的开始地址
|
||||
* @param pFbdev 参照结构体 fbdev
|
||||
* @return void
|
||||
*/
|
||||
void pmem_start(PFBDEV pFbdev);
|
||||
|
||||
/*
|
||||
* 该函数用于打印FB_TYPE
|
||||
* @param pFbdev 参照结构体 fbdev
|
||||
* @return void
|
||||
*/
|
||||
void p_type(PFBDEV pFbdev);
|
||||
|
||||
/*
|
||||
* 该函数用于打印可见清晰度
|
||||
* @param pFbdev 参照结构体 fbdev
|
||||
* @return void
|
||||
*/
|
||||
void p_visible_res(PFBDEV pFbdev);
|
||||
|
||||
/*
|
||||
* 该函数用于打印虚拟分辨率
|
||||
* @param pFbdev 参照结构体 fbdev
|
||||
* @return void
|
||||
*/
|
||||
void p_virt_res(PFBDEV pFbdev);
|
||||
|
||||
/*
|
||||
* 该函数用于打印虚拟到可见的偏移量
|
||||
* @param pFbdev 参照结构体 fbdev
|
||||
* @return void
|
||||
*/
|
||||
void p_offset(PFBDEV pFbdev);
|
||||
|
||||
/*
|
||||
* 该函数用于打印每个像素的位数
|
||||
* @param pFbdev 参照结构体 fbdev
|
||||
* @return void
|
||||
*/
|
||||
void p_bpp(PFBDEV pFbdev);
|
||||
|
||||
/*
|
||||
* 该函数用于打印R,G,B和透明度
|
||||
* @param pFbdev 参照结构体 fbdev
|
||||
* @return void
|
||||
*/
|
||||
void p_rgbt(PFBDEV pFbdev);
|
||||
|
||||
/*
|
||||
* 该函数用于打印在内存中的高度和宽度
|
||||
* @param pFbdev 参照结构体 fbdev
|
||||
* @return void
|
||||
*/
|
||||
void p_hw(PFBDEV pFbdev);
|
||||
|
||||
/*
|
||||
* 将addr开始的len个字符用n替换
|
||||
* @param addr 开始的地址
|
||||
* @param n 替换后的字符
|
||||
* @param len 要替换的字符的个数
|
||||
* @return void
|
||||
*/
|
||||
void clear_con(void *addr,int n,size_t len);
|
||||
|
||||
/*
|
||||
* 该函数将逻辑地址空间的数据映射到内存当中
|
||||
* @param addr 内存空间的地址
|
||||
* @param color 颜色值
|
||||
* @param len 需要映射的长度
|
||||
* @return void
|
||||
*/
|
||||
void inline fb_memcpy(void *addr,void *color,size_t len);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* 根据字符串获得相应的RGBT
|
||||
* @param color 颜色对应的字符串
|
||||
* @return 返回代表颜色的结构体 RGBT
|
||||
*/
|
||||
RGBT getRGBT(const char *color);
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,633 @@
|
|||
/* Framebuffer Graphics Libary for Linux, Copyright 1993 Harm Hanemaayer */
|
||||
/* line.c Line drawing */
|
||||
#define DO_NOT_USE_VGALIB
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifndef DO_NOT_USE_VGALIB
|
||||
#include <vga.h>
|
||||
#endif
|
||||
|
||||
#include "inlstring.h" /* include inline string operations */
|
||||
|
||||
#include "vgagl.h"
|
||||
#include "def.h"
|
||||
#include "driver.h"
|
||||
|
||||
|
||||
#ifdef __alpha__
|
||||
|
||||
static inline int muldiv64(int m1, int m2, int d)
|
||||
{
|
||||
return (long) m1 *(long) m2 / (long) d;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#ifdef NO_ASSEMBLY
|
||||
|
||||
static inline int muldiv64(int m1, int m2, int d)
|
||||
{
|
||||
return (float) m1 * (float) m2 / ((float) d);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/* We use the 32-bit to 64-bit multiply and 64-bit to 32-bit divide of the */
|
||||
/* 386 (which gcc doesn't know well enough) to efficiently perform integer */
|
||||
/* scaling without having to worry about overflows. */
|
||||
|
||||
static inline int muldiv64(int m1, int m2, int d)
|
||||
{
|
||||
/* int32 * int32 -> int64 / int32 -> int32 */
|
||||
int result;
|
||||
int dummy;
|
||||
__asm__(
|
||||
"imull %%edx\n\t"
|
||||
"idivl %4\n\t"
|
||||
: "=a"(result), "=d"(dummy) /* out */
|
||||
: "0"(m1), "1"(m2), "g"(d) /* in */
|
||||
/***rjr***: "ax", "dx" ***/ /* mod */
|
||||
);
|
||||
return result;
|
||||
}
|
||||
|
||||
#endif /* !NO_ASSEMBLY */
|
||||
#endif /* !__alpha__ */
|
||||
|
||||
#ifdef __alpha__
|
||||
|
||||
static inline int gl_regioncode(int x, int y)
|
||||
{
|
||||
int result = 0;
|
||||
if (x < __clipx1)
|
||||
result |= 1;
|
||||
else if (x > __clipx2)
|
||||
result |= 2;
|
||||
if (y < __clipy1)
|
||||
result |= 4;
|
||||
else if (y > __clipy2)
|
||||
result |= 8;
|
||||
return result;
|
||||
}
|
||||
|
||||
#else
|
||||
#ifdef NO_ASSEMBLY
|
||||
|
||||
static inline int gl_regioncode (int x, int y)
|
||||
{
|
||||
int result = 0;
|
||||
if (x < __clipx1)
|
||||
result |= 1;
|
||||
else if (x > __clipx2)
|
||||
result |= 2;
|
||||
if (y < __clipy1)
|
||||
result |= 4;
|
||||
else if (y > __clipy2)
|
||||
result |= 8;
|
||||
return result;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#define INC_IF_NEG(y, result) \
|
||||
{ \
|
||||
__asm__("btl $31,%1\n\t" \
|
||||
"adcl $0,%0" \
|
||||
: "=r" ((int) result) \
|
||||
: "rm" ((int) (y)), "0" ((int) result) \
|
||||
); \
|
||||
}
|
||||
|
||||
static inline int gl_regioncode (int x, int y)
|
||||
{
|
||||
int dx1, dx2, dy1, dy2;
|
||||
int result;
|
||||
result = 0;
|
||||
dy2 = __clipy2 - y;
|
||||
INC_IF_NEG (dy2, result);
|
||||
result <<= 1;
|
||||
dy1 = y - __clipy1;
|
||||
INC_IF_NEG (dy1, result);
|
||||
result <<= 1;
|
||||
dx2 = __clipx2 - x;
|
||||
INC_IF_NEG (dx2, result);
|
||||
result <<= 1;
|
||||
dx1 = x - __clipx1;
|
||||
INC_IF_NEG (dx1, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
#endif /* ! NO_ASSEMBLY */
|
||||
#endif /* !__alpha__ */
|
||||
|
||||
|
||||
#define line_start_paged(s) \
|
||||
fp = y * bytesperrow + x * s; \
|
||||
vga_setpage (fpp = (fp >> 16)); \
|
||||
fp &= 0xFFFF;
|
||||
|
||||
#define line_start_linear(s) \
|
||||
vp = VBUF + y * bytesperrow + x * s;
|
||||
|
||||
|
||||
#define line_loop_paged_a(m,i,u,v) \
|
||||
{ \
|
||||
int d = ay - (ax >> 1); \
|
||||
if ((x = abs (dx))) \
|
||||
do { \
|
||||
i; \
|
||||
if (d m 0) { \
|
||||
fp v; \
|
||||
d -= ax; \
|
||||
} \
|
||||
fp u; \
|
||||
d += ay; \
|
||||
if (fp & 0xFFFF0000) { /* has it cross a page boundary ? */ \
|
||||
fpp += fp >> 16; \
|
||||
vga_setpage (fpp); \
|
||||
} \
|
||||
fp &= 0x0000FFFF; \
|
||||
} while (--x); \
|
||||
}
|
||||
|
||||
#define line_loop_linear_a(m,i,u,v) \
|
||||
{ \
|
||||
int d = ay - (ax >> 1); \
|
||||
if ((x = abs (dx))) \
|
||||
do { \
|
||||
i; \
|
||||
if (d m 0) { \
|
||||
vp v; \
|
||||
d -= ax; \
|
||||
} \
|
||||
vp u; \
|
||||
d += ay; \
|
||||
} while (--x); \
|
||||
}
|
||||
|
||||
|
||||
#define line_loop_paged_b(m,i,u,v) \
|
||||
{ \
|
||||
int d = ax - (ay >> 1); \
|
||||
if ((y = abs (dy))) \
|
||||
do { \
|
||||
i; \
|
||||
if (d m 0) { \
|
||||
fp u; \
|
||||
d -= ay; \
|
||||
} \
|
||||
fp v; \
|
||||
d += ax; \
|
||||
if (fp & 0xFFFF0000) { \
|
||||
fpp += fp >> 16; \
|
||||
vga_setpage (fpp); \
|
||||
} \
|
||||
fp &= 0x0000FFFF; \
|
||||
} while (--y); \
|
||||
}
|
||||
|
||||
|
||||
#define line_loop_linear_b(m,i,u,v) \
|
||||
{ \
|
||||
int d = ax - (ay >> 1); \
|
||||
if ((y = abs (dy))) \
|
||||
do { \
|
||||
i; \
|
||||
if (d m 0) { \
|
||||
vp u; \
|
||||
d -= ay; \
|
||||
} \
|
||||
vp v; \
|
||||
d += ax; \
|
||||
} while (--y); \
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Partly based on the work which was partly based on vgalib by Tommy Frandsen */
|
||||
/* This is a lot faster now that setpixel is inlined */
|
||||
|
||||
void gl_line (int x1, int y1, int x2, int y2, int c)
|
||||
{
|
||||
int dx, dy, ax, ay, sx, sy, x, y;
|
||||
int bytesperrow;
|
||||
unsigned char *vp = NULL;
|
||||
|
||||
if (__clip)
|
||||
/* Cohen & Sutherland algorithm */
|
||||
for (;;) {
|
||||
int r1 = gl_regioncode (x1, y1);
|
||||
int r2 = gl_regioncode (x2, y2);
|
||||
if (!(r1 | r2))
|
||||
break; /* completely inside */
|
||||
if (r1 & r2)
|
||||
return; /* completely outside */
|
||||
if (r1 == 0) {
|
||||
swap (x1, x2); /* make sure first */
|
||||
swap (y1, y2); /* point is outside */
|
||||
r1 = r2;
|
||||
}
|
||||
if (r1 & 1) { /* left */
|
||||
y1 += muldiv64 (__clipx1 - x1, y2 - y1, x2 - x1);
|
||||
x1 = __clipx1;
|
||||
} else if (r1 & 2) { /* right */
|
||||
y1 += muldiv64 (__clipx2 - x1, y2 - y1, x2 - x1);
|
||||
x1 = __clipx2;
|
||||
} else if (r1 & 4) { /* top */
|
||||
x1 += muldiv64 (__clipy1 - y1, x2 - x1, y2 - y1);
|
||||
y1 = __clipy1;
|
||||
} else if (r1 & 8) { /* bottom */
|
||||
x1 += muldiv64 (__clipy2 - y1, x2 - x1, y2 - y1);
|
||||
y1 = __clipy2;
|
||||
}
|
||||
}
|
||||
dx = x2 - x1;
|
||||
dy = y2 - y1;
|
||||
ax = abs (dx) << 1;
|
||||
ay = abs (dy) << 1;
|
||||
sx = (dx >= 0) ? 1 : -1;
|
||||
sy = (dy >= 0) ? 1 : -1;
|
||||
x = x1;
|
||||
y = y1;
|
||||
|
||||
#ifdef __alpha__
|
||||
if (ax > ay) {
|
||||
int d = ay - (ax >> 1);
|
||||
while (x != x2) {
|
||||
setpixel (x, y, c);
|
||||
|
||||
if (d > 0 || (d == 0 && sx == 1)) {
|
||||
y += sy;
|
||||
d -= ax;
|
||||
}
|
||||
x += sx;
|
||||
d += ay;
|
||||
}
|
||||
} else {
|
||||
int d = ax - (ay >> 1);
|
||||
while (y != y2) {
|
||||
setpixel (x, y, c);
|
||||
|
||||
if (d > 0 || (d == 0 && sy == 1)) {
|
||||
x += sx;
|
||||
d -= ay;
|
||||
}
|
||||
y += sy;
|
||||
d += ax;
|
||||
}
|
||||
}
|
||||
|
||||
setpixel (x, y, c);
|
||||
|
||||
#else
|
||||
|
||||
#define insert_pixel_1 *((unsigned char *) vp) = c;
|
||||
#define insert_pixel_2 *((unsigned short *) vp) = c;
|
||||
|
||||
#define insert_pixel_3 *((unsigned char *) vp) = c; \
|
||||
*((unsigned char *) (vp + 1)) = (c>>8); \
|
||||
*((unsigned char *) (vp + 2)) = (c>>16);
|
||||
|
||||
#define insert_pixel_4 *((unsigned long *) vp) = c;
|
||||
|
||||
bytesperrow = BYTEWIDTH;
|
||||
|
||||
if (MODETYPE == CONTEXT_VIRTUAL || MODETYPE == CONTEXT_LINEAR) {
|
||||
switch BYTESPERPIXEL {
|
||||
case 1:
|
||||
line_start_linear(1);
|
||||
if (ax > ay) {
|
||||
if(sx > 0) {
|
||||
line_loop_linear_a(>=,insert_pixel_1,++,+=bytesperrow*sy);
|
||||
} else {
|
||||
line_loop_linear_a(>,insert_pixel_1,--,+=bytesperrow*sy);
|
||||
}
|
||||
} else {
|
||||
if(sy > 0) {
|
||||
line_loop_linear_b(>=,insert_pixel_1,+=sx,+=bytesperrow);
|
||||
} else {
|
||||
line_loop_linear_b(>,insert_pixel_1,+=sx,-=bytesperrow);
|
||||
}
|
||||
}
|
||||
insert_pixel_1;
|
||||
break;
|
||||
case 2:
|
||||
line_start_linear(2);
|
||||
if (ax > ay) {
|
||||
if(sx > 0) {
|
||||
line_loop_linear_a(>=,insert_pixel_2,+=2,+=bytesperrow*sy);
|
||||
} else {
|
||||
line_loop_linear_a(>,insert_pixel_2,-=2,+=bytesperrow*sy);
|
||||
}
|
||||
} else {
|
||||
sx <<= 1;
|
||||
if(sy > 0) {
|
||||
line_loop_linear_b(>=,insert_pixel_2,+=sx,+=bytesperrow);
|
||||
} else {
|
||||
line_loop_linear_b(>,insert_pixel_2,+=sx,-=bytesperrow);
|
||||
}
|
||||
}
|
||||
insert_pixel_2;
|
||||
break;
|
||||
case 3:
|
||||
line_start_linear(3);
|
||||
if (ax > ay) {
|
||||
if(sx > 0) {
|
||||
line_loop_linear_a(>=,insert_pixel_3,+=3,+=bytesperrow*sy);
|
||||
} else {
|
||||
line_loop_linear_a(>,insert_pixel_3,-=3,+=bytesperrow*sy);
|
||||
}
|
||||
} else {
|
||||
sx *= 3;
|
||||
if(sy > 0) {
|
||||
line_loop_linear_b(>=,insert_pixel_3,+=sx,+=bytesperrow);
|
||||
} else {
|
||||
line_loop_linear_b(>,insert_pixel_3,+=sx,-=bytesperrow);
|
||||
}
|
||||
}
|
||||
insert_pixel_3;
|
||||
break;
|
||||
case 4:
|
||||
line_start_linear(4);
|
||||
if (ax > ay) {
|
||||
if(sx > 0) {
|
||||
line_loop_linear_a(>=,insert_pixel_4,+=4,+=bytesperrow*sy);
|
||||
} else {
|
||||
line_loop_linear_a(>,insert_pixel_4,-=4,+=bytesperrow*sy);
|
||||
}
|
||||
} else {
|
||||
sx <<= 2;
|
||||
if(sy > 0) {
|
||||
line_loop_linear_b(>=,insert_pixel_4,+=sx,+=bytesperrow);
|
||||
} else {
|
||||
line_loop_linear_b(>,insert_pixel_4,+=sx,-=bytesperrow);
|
||||
}
|
||||
}
|
||||
insert_pixel_4;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#ifndef DO_NOT_USE_VGALIB
|
||||
|
||||
#undef insert_pixel_1
|
||||
#undef insert_pixel_2
|
||||
#undef insert_pixel_3
|
||||
#undef insert_pixel_4
|
||||
|
||||
#define insert_pixel_1 *((unsigned char *) (vp + fp)) = c;
|
||||
#define insert_pixel_2 *((unsigned short *) (vp + fp)) = c;
|
||||
|
||||
#define insert_pixel_3 *((unsigned char *) (vp + fp)) = c; \
|
||||
*((unsigned char *) (vp + fp + 1)) = (c>>8); \
|
||||
*((unsigned char *) (vp + fp + 2)) = (c>>16);
|
||||
|
||||
#define insert_pixel_4 *((unsigned long *) (vp + fp)) = c;
|
||||
|
||||
|
||||
if (MODETYPE == CONTEXT_PAGED) {
|
||||
vp = VBUF;
|
||||
switch BYTESPERPIXEL {
|
||||
int fpp;
|
||||
int fp;
|
||||
case 1:
|
||||
line_start_paged(1);
|
||||
if (ax > ay) {
|
||||
if(sx > 0) {
|
||||
line_loop_paged_a(>=,insert_pixel_1,++,+=bytesperrow*sy);
|
||||
} else {
|
||||
line_loop_paged_a(>,insert_pixel_1,--,+=bytesperrow*sy);
|
||||
}
|
||||
} else {
|
||||
if(sy > 0) {
|
||||
line_loop_paged_b(>=,insert_pixel_1,+=sx,+=bytesperrow);
|
||||
} else {
|
||||
line_loop_paged_b(>,insert_pixel_1,+=sx,-=bytesperrow);
|
||||
}
|
||||
}
|
||||
insert_pixel_1;
|
||||
break;
|
||||
case 2:
|
||||
line_start_paged(2);
|
||||
if (ax > ay) {
|
||||
if(sx > 0) {
|
||||
line_loop_paged_a(>=,insert_pixel_2,+=2,+=bytesperrow*sy);
|
||||
} else {
|
||||
line_loop_paged_a(>,insert_pixel_2,-=2,+=bytesperrow*sy);
|
||||
}
|
||||
} else {
|
||||
sx <<= 1;
|
||||
if(sy > 0) {
|
||||
line_loop_paged_b(>=,insert_pixel_2,+=sx,+=bytesperrow);
|
||||
} else {
|
||||
line_loop_paged_b(>,insert_pixel_2,+=sx,-=bytesperrow);
|
||||
}
|
||||
}
|
||||
insert_pixel_2;
|
||||
break;
|
||||
case 3:
|
||||
line_start_paged(3);
|
||||
if (ax > ay) {
|
||||
if(sx > 0) {
|
||||
line_loop_paged_a(>=,insert_pixel_3,+=3,+=bytesperrow*sy);
|
||||
} else {
|
||||
line_loop_paged_a(>,insert_pixel_3,-=3,+=bytesperrow*sy);
|
||||
}
|
||||
} else {
|
||||
sx *= 3;
|
||||
if(sy > 0) {
|
||||
line_loop_paged_b(>=,insert_pixel_3,+=sx,+=bytesperrow);
|
||||
} else {
|
||||
line_loop_paged_b(>,insert_pixel_3,+=sx,-=bytesperrow);
|
||||
}
|
||||
}
|
||||
insert_pixel_3;
|
||||
break;
|
||||
case 4:
|
||||
line_start_paged(4);
|
||||
if (ax > ay) {
|
||||
if(sx > 0) {
|
||||
line_loop_paged_a(>=,insert_pixel_4,+=4,+=bytesperrow*sy);
|
||||
} else {
|
||||
line_loop_paged_a(>,insert_pixel_4,-=4,+=bytesperrow*sy);
|
||||
}
|
||||
} else {
|
||||
sx <<= 2;
|
||||
if(sy > 0) {
|
||||
line_loop_paged_b(>=,insert_pixel_4,+=sx,+=bytesperrow);
|
||||
} else {
|
||||
line_loop_paged_b(>,insert_pixel_4,+=sx,-=bytesperrow);
|
||||
}
|
||||
}
|
||||
insert_pixel_4;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
if (!vp) {
|
||||
|
||||
if (ax > ay) {
|
||||
int d = ay - (ax >> 1);
|
||||
while (x != x2) {
|
||||
setpixel (x, y, c);
|
||||
|
||||
if (d > 0 || (d == 0 && sx == 1)) {
|
||||
y += sy;
|
||||
d -= ax;
|
||||
}
|
||||
x += sx;
|
||||
d += ay;
|
||||
}
|
||||
} else {
|
||||
int d = ax - (ay >> 1);
|
||||
while (y != y2) {
|
||||
setpixel (x, y, c);
|
||||
|
||||
if (d > 0 || (d == 0 && sy == 1)) {
|
||||
x += sx;
|
||||
d -= ay;
|
||||
}
|
||||
y += sy;
|
||||
d += ax;
|
||||
}
|
||||
}
|
||||
setpixel (x, y, c);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
static void gl_setcirclepixels(int x, int y, int sx, int sy, int c)
|
||||
{
|
||||
if (__clip) {
|
||||
int z = max(x, y);
|
||||
if (sx - z < __clipx1 || sx + z > __clipx2
|
||||
|| sy - z < __clipy1 || sy + z > __clipy2) {
|
||||
/* use setpixel clipping */
|
||||
gl_setpixel(sx + x, sy + y, c);
|
||||
gl_setpixel(sx - x, sy + y, c);
|
||||
gl_setpixel(sx + x, sy - y, c);
|
||||
gl_setpixel(sx - x, sy - y, c);
|
||||
gl_setpixel(sx + y, sy + x, c);
|
||||
gl_setpixel(sx - y, sy + x, c);
|
||||
gl_setpixel(sx + y, sy - x, c);
|
||||
gl_setpixel(sx - y, sy - x, c);
|
||||
return;
|
||||
}
|
||||
}
|
||||
setpixel(sx + x, sy + y, c);
|
||||
setpixel(sx - x, sy + y, c);
|
||||
setpixel(sx + x, sy - y, c);
|
||||
setpixel(sx - x, sy - y, c);
|
||||
setpixel(sx + y, sy + x, c);
|
||||
setpixel(sx - y, sy + x, c);
|
||||
setpixel(sx + y, sy - x, c);
|
||||
setpixel(sx - y, sy - x, c);
|
||||
}
|
||||
|
||||
void gl_circle(int sx, int sy, int r, int c)
|
||||
{
|
||||
int x, y, d;
|
||||
if (r < 1) {
|
||||
gl_setpixel(sx, sy, c);
|
||||
return;
|
||||
}
|
||||
if (__clip)
|
||||
if (sx + r < __clipx1 || sx - r > __clipx2
|
||||
|| sy + r < __clipy1 || sy - r > __clipy2)
|
||||
return;
|
||||
x = 0;
|
||||
y = r;
|
||||
d = 1 - r;
|
||||
gl_setcirclepixels(x, y, sx, sy, c);
|
||||
while (x < y) {
|
||||
if (d < 0)
|
||||
d += x * 2 + 3;
|
||||
else {
|
||||
d += x * 2 - y * 2 + 5;
|
||||
y--;
|
||||
}
|
||||
x++;
|
||||
gl_setcirclepixels(x, y, sx, sy, c);
|
||||
}
|
||||
}
|
||||
|
||||
void gl_fillcircle(int sx, int sy, int r, int c)
|
||||
{
|
||||
int x = 0,
|
||||
y = r,
|
||||
d = 1 - r;
|
||||
|
||||
if (r < 1) {
|
||||
gl_setpixel(sx, sy, c);
|
||||
return;
|
||||
}
|
||||
if (__clip)
|
||||
if (sx + r < __clipx1 || sx - r > __clipx2
|
||||
|| sy + r < __clipy1 || sy - r > __clipy2)
|
||||
return;
|
||||
gl_hline(sx - x, sy + y, sx + x, c);
|
||||
gl_hline(sx - x, sy - y, sx + x, c);
|
||||
gl_hline(sx - y, sy + x, sx + y, c);
|
||||
gl_hline(sx - y, sy - x, sx + y, c);
|
||||
while (x < y)
|
||||
{
|
||||
if (d < 0)
|
||||
{
|
||||
d += x * 2 + 3;
|
||||
} else {
|
||||
d += x * 2 - y * 2 + 5;
|
||||
y--;
|
||||
}
|
||||
x++;
|
||||
gl_hline(sx - x, sy + y, sx + x, c);
|
||||
gl_hline(sx - x, sy - y, sx + x, c);
|
||||
gl_hline(sx - y, sy + x, sx + y, c);
|
||||
gl_hline(sx - y, sy - x, sx + y, c);
|
||||
}
|
||||
}
|
||||
|
||||
void gl_bcircle(int sx, int sy, int r, int c, int fill)
|
||||
{
|
||||
int x = 0,
|
||||
y = r,
|
||||
d = 2 * (1 - r);
|
||||
|
||||
if (r < 1) {
|
||||
gl_setpixel(sx, sy, c);
|
||||
return;
|
||||
}
|
||||
if (__clip)
|
||||
if (sx + r < __clipx1 || sx - r > __clipx2
|
||||
|| sy + r < __clipy1 || sy - r > __clipy2)
|
||||
return;
|
||||
while (y >= 0)
|
||||
{
|
||||
if (fill == 0)
|
||||
{
|
||||
gl_setpixel(sx + x, sy + y, c);
|
||||
gl_setpixel(sx + x, sy - y, c);
|
||||
gl_setpixel(sx - x, sy + y, c);
|
||||
gl_setpixel(sx - x, sy - y, c);
|
||||
} else {
|
||||
gl_hline(sx - x, sy + y, sx + x, c);
|
||||
gl_hline(sx - x, sy - y, sx + x, c);
|
||||
}
|
||||
if ((d + y) > 0)
|
||||
{
|
||||
y--;
|
||||
d -= (2 * y * WIDTH / HEIGHT) - 1;
|
||||
}
|
||||
if (x > d)
|
||||
{
|
||||
x++;
|
||||
d += (2 * x) + 1;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,667 @@
|
|||
/* Framebuffer Graphics Libary for Linux, Copyright 1993 Harm Hanemaayer */
|
||||
/* grlib.c Main module */
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
//#include <vga.h>
|
||||
|
||||
#include "vgagl.h"
|
||||
|
||||
|
||||
#define outside(x, y) (x < __clipx1 || x > __clipx2)
|
||||
/* Global variables */
|
||||
|
||||
#ifdef DLL_CONTEXT_SHADOW
|
||||
|
||||
/* The current context variable is shadowed in a read-only variable for */
|
||||
/* external use. */
|
||||
|
||||
GraphicsContext __currentcontext; /* Internal current context. */
|
||||
GraphicsContext currentcontext; /* Copy for external use. */
|
||||
|
||||
#else
|
||||
|
||||
GraphicsContext currentcontext;
|
||||
|
||||
#endif
|
||||
|
||||
void (*__svgalib_nonaccel_fillbox)(int, int, int, int, int);
|
||||
static int screenoffset = 0; /* Used by copy(box)toscreen. */
|
||||
|
||||
|
||||
|
||||
|
||||
/* Initialization and graphics contexts */
|
||||
|
||||
#define SCREENSIZE(gc) ((gc).bytewidth * (gc).height)
|
||||
|
||||
static int colorbits(int c)
|
||||
{
|
||||
switch (c) {
|
||||
default:
|
||||
case 256:
|
||||
return 8;
|
||||
case 32768:
|
||||
return 15;
|
||||
case 65536:
|
||||
return 16;
|
||||
case 256 * 65536:
|
||||
return 24;
|
||||
}
|
||||
}
|
||||
|
||||
int gl_setcontextvga(int m)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int gl_setcontextvgavirtual(int m)
|
||||
{
|
||||
}
|
||||
|
||||
GraphicsContext *
|
||||
gl_allocatecontext()
|
||||
{
|
||||
return malloc(sizeof(GraphicsContext));
|
||||
}
|
||||
|
||||
void gl_setcontext(GraphicsContext * gc)
|
||||
{
|
||||
__currentcontext = *gc;
|
||||
#ifdef DLL_CONTEXT_SHADOW
|
||||
currentcontext = *gc;
|
||||
#endif
|
||||
}
|
||||
|
||||
void gl_getcontext(GraphicsContext * gc)
|
||||
{
|
||||
*gc = __currentcontext;
|
||||
}
|
||||
|
||||
void gl_freecontext(GraphicsContext * gc)
|
||||
{
|
||||
if (gc->modetype == CONTEXT_VIRTUAL)
|
||||
free(gc->vbuf);
|
||||
}
|
||||
|
||||
void gl_setcontextwidth(int w)
|
||||
{
|
||||
__currentcontext.width = w;
|
||||
currentcontext.width = w;
|
||||
__currentcontext.bytewidth = w * BYTESPERPIXEL;
|
||||
currentcontext.bytewidth = __currentcontext.bytewidth;
|
||||
|
||||
}
|
||||
|
||||
void gl_setcontextheight(int h)
|
||||
{
|
||||
__currentcontext.height = currentcontext.height = h;
|
||||
}
|
||||
|
||||
|
||||
/* Clipping */
|
||||
|
||||
void gl_setclippingwindow(int x1, int y1, int x2, int y2)
|
||||
{
|
||||
__clip = 1;
|
||||
__clipx1 = x1;
|
||||
__clipy1 = y1;
|
||||
__clipx2 = x2;
|
||||
__clipy2 = y2;
|
||||
}
|
||||
|
||||
void gl_enableclipping()
|
||||
{
|
||||
__clip = 1;
|
||||
__clipx1 = 0;
|
||||
__clipy1 = 0;
|
||||
__clipx2 = WIDTH - 1;
|
||||
__clipy2 = HEIGHT - 1;
|
||||
}
|
||||
|
||||
void gl_disableclipping()
|
||||
{
|
||||
__clip = 0;
|
||||
}
|
||||
|
||||
|
||||
/* Primitive functions */
|
||||
|
||||
void gl_setpixel(int x, int y, int c)
|
||||
{
|
||||
if (__clip && outside(x, y))
|
||||
return;
|
||||
setpixel(x, y, c);
|
||||
}
|
||||
|
||||
int gl_getpixel(int x, int y)
|
||||
{
|
||||
if (__clip && outside(x, y))
|
||||
return -1;
|
||||
return getpixel(x, y);
|
||||
}
|
||||
|
||||
void gl_hline(int x1, int y, int x2, int c)
|
||||
{
|
||||
if (__clip) {
|
||||
if (y_outside(y))
|
||||
return;
|
||||
clipxleft(x1);
|
||||
clipxright(x2);
|
||||
}
|
||||
if (x1 > x2)
|
||||
return;
|
||||
hline(x1, y, x2, c);
|
||||
}
|
||||
|
||||
#define ADJUSTBITMAPBOX() \
|
||||
nw = w; nh = h; nx = x; ny = y; \
|
||||
if (nx + nw < __clipx1 || nx > __clipx2) \
|
||||
return; \
|
||||
if (ny + nh < __clipy1 || ny > __clipy2) \
|
||||
return; \
|
||||
if (nx < __clipx1) { /* left adjust */ \
|
||||
nw += nx - __clipx1; \
|
||||
nx = __clipx1; \
|
||||
} \
|
||||
if (ny < __clipy1) { /* top adjust */ \
|
||||
nh += ny - __clipy1; \
|
||||
ny = __clipy1; \
|
||||
} \
|
||||
if (nx + nw > __clipx2) /* right adjust */ \
|
||||
nw = __clipx2 - nx + 1; \
|
||||
if (ny + nh > __clipy2) /* bottom adjust */ \
|
||||
nh = __clipy2 - ny + 1; \
|
||||
|
||||
void gl_fillbox(int x, int y, int w, int h, int c)
|
||||
{
|
||||
if (__clip) {
|
||||
if (x + w < __clipx1 || x > __clipx2)
|
||||
return;
|
||||
if (y + h < __clipy1 || y > __clipy2)
|
||||
return;
|
||||
if (x < __clipx1) {
|
||||
w -= __clipx1 - x;
|
||||
x = __clipx1;
|
||||
}
|
||||
if (y < __clipy1) {
|
||||
h -= __clipy1 - y;
|
||||
y = __clipy1;
|
||||
}
|
||||
if (x + w > __clipx2 + 1)
|
||||
w = __clipx2 - x + 1;
|
||||
if (y + h > __clipy2 + 1)
|
||||
h = __clipy2 - y + 1;
|
||||
}
|
||||
if (w <= 0 || h <= 0)
|
||||
return;
|
||||
fillbox(x, y, w, h, c);
|
||||
}
|
||||
|
||||
void gl_putboxpart(int x, int y, int w, int h, int ow, int oh, void *b,
|
||||
int ox, int oy)
|
||||
{
|
||||
putboxpart(x, y, w, h, ow, oh, b, ox, oy);
|
||||
}
|
||||
|
||||
void gl_putbox(int x, int y, int w, int h, void *b)
|
||||
{
|
||||
uchar *bp = b;
|
||||
if (w <= 0 || h <= 0)
|
||||
return;
|
||||
if (__clip) {
|
||||
int nx, ny, nw, nh;
|
||||
ADJUSTBITMAPBOX();
|
||||
if (nw <= 0 || nh <= 0)
|
||||
return;
|
||||
if (nw != w || nh != h) {
|
||||
putboxpart(nx, ny, nw, nh, w, h, bp, nx - x, ny - y);
|
||||
return;
|
||||
}
|
||||
}
|
||||
putbox(x, y, w, h, bp, w);
|
||||
}
|
||||
|
||||
static void emulate_putboxmask(int x, int y, int w, int h, void *b)
|
||||
{
|
||||
void *box;
|
||||
GraphicsContext gc;
|
||||
box = alloca(w * h * BYTESPERPIXEL);
|
||||
gl_getbox(x, y, w, h, box); /* does clipping */
|
||||
|
||||
gl_getcontext(&gc); /* save context */
|
||||
|
||||
/* create context that is only the box */
|
||||
gl_setcontextvirtual(w, h, BYTESPERPIXEL, BITSPERPIXEL, box);
|
||||
gl_putboxmask(0, 0, w, h, b);
|
||||
|
||||
gl_setcontext(&gc); /* restore context */
|
||||
gl_putbox(x, y, w, h, box);
|
||||
}
|
||||
|
||||
void gl_putboxmask(int x, int y, int w, int h, void *b)
|
||||
{
|
||||
if (w <= 0 || h <= 0)
|
||||
return;
|
||||
if (__clip) {
|
||||
if (x + w < __clipx1 || x > __clipx2)
|
||||
return;
|
||||
if (y + h < __clipy1 || y > __clipy2)
|
||||
return;
|
||||
if (x < __clipx1 || y < __clipy1
|
||||
|| x + w > __clipx2 + 1 || y + h > __clipy2 + 1) {
|
||||
/* clipping is not directly implemented */
|
||||
emulate_putboxmask(x, y, w, h, b);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (MODETYPE == CONTEXT_PAGED)
|
||||
/* paged primitive is not implemented */
|
||||
emulate_putboxmask(x, y, w, h, b);
|
||||
else
|
||||
putboxmask(x, y, w, h, b);
|
||||
}
|
||||
|
||||
void gl_getbox(int x, int y, int w, int h, void *b)
|
||||
{
|
||||
if (__clip) {
|
||||
int nx, ny, nw, nh;
|
||||
ADJUSTBITMAPBOX();
|
||||
if (nw <= 0 || nh <= 0)
|
||||
return;
|
||||
if (nw != w || nh != h) {
|
||||
getboxpart(nx, ny, nw, nh, w, h, b, nx - x, ny - y);
|
||||
return;
|
||||
}
|
||||
}
|
||||
getbox(x, y, w, h, b, w);
|
||||
}
|
||||
|
||||
void gl_copybox(int x1, int y1, int w, int h, int x2, int y2)
|
||||
{
|
||||
/* Doesn't handle clipping. */
|
||||
if (MODETYPE == CONTEXT_PAGED) {
|
||||
/* Paged primitive is not implemented. */
|
||||
void *box;
|
||||
box = alloca(w * h * BYTESPERPIXEL);
|
||||
getbox(x1, y1, w, h, box, w);
|
||||
putbox(x2, y2, w, h, box, w);
|
||||
return;
|
||||
}
|
||||
copybox(x1, y1, w, h, x2, y2);
|
||||
}
|
||||
|
||||
|
||||
/* Miscellaneous functions */
|
||||
|
||||
void gl_clearscreen(int c)
|
||||
{
|
||||
gl_fillbox(0, 0, WIDTH, HEIGHT, c);
|
||||
}
|
||||
|
||||
int gl_rgbcolor(int r, int g, int b)
|
||||
{
|
||||
unsigned v;
|
||||
switch (BITSPERPIXEL) {
|
||||
case 8:
|
||||
/* assumes RGB palette at index 0-255 */
|
||||
/* bits 0-2 = blue (3 bits) */
|
||||
/* 3-5 = green (3 bits) */
|
||||
/* 6-7 = red (2 bits) */
|
||||
return (r & 0xc0) + ((g & 0xe0) >> 2) + (b >> 5);
|
||||
case 24:
|
||||
case 32:
|
||||
v = (r << 16) + (g << 8) + b;
|
||||
if (MODEFLAGS & MODEFLAG_32BPP_SHIFT8)
|
||||
return v << 8;
|
||||
return v;
|
||||
case 15:
|
||||
return ((r & 0xf8) << 7) + ((g & 0xf8) << 2) + (b >> 3);
|
||||
case 16:
|
||||
return ((r & 0xf8) << 8) + ((g & 0xfc) << 3) + (b >> 3);
|
||||
case 4:
|
||||
/* Now this is real fun. Map to standard EGA palette. */
|
||||
v = 0;
|
||||
if (b >= 64)
|
||||
v += 1;
|
||||
if (g >= 64)
|
||||
v += 2;
|
||||
if (r >= 64)
|
||||
v += 4;
|
||||
if (b >= 192 || g >= 192 || r >= 192)
|
||||
v += 8;
|
||||
return v;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void gl_setpixelrgb(int x, int y, int r, int g, int b)
|
||||
{
|
||||
/* Color components range from 0 to 255 */
|
||||
if (__clip && outside(x, y))
|
||||
return;
|
||||
setpixel(x, y, gl_rgbcolor(r, g, b));
|
||||
}
|
||||
|
||||
void gl_getpixelrgb(int x, int y, int *r, int *g, int *b)
|
||||
{
|
||||
unsigned c;
|
||||
if (__clip && outside(x, y)) {
|
||||
*r = *g = *b = -1;
|
||||
return;
|
||||
}
|
||||
c = getpixel(x, y);
|
||||
switch (BITSPERPIXEL) {
|
||||
case 8:
|
||||
*b = (c & (1 + 2 + 4)) << 5; /* bits 0-2 */
|
||||
*g = (c & (8 + 16 + 32)) << 2; /* bits 3-5 */
|
||||
*r = (c & (64 + 128)); /* bits 6-7 */
|
||||
break;
|
||||
case 32:
|
||||
if (MODEFLAGS & MODEFLAG_32BPP_SHIFT8) {
|
||||
*b = (c & 0xff00) >> 8;
|
||||
*g = (c & 0xff0000) >> 16;
|
||||
*r = c >> 24;
|
||||
break;
|
||||
}
|
||||
case 24:
|
||||
*b = c & 0xff;
|
||||
*g = (c & 0xff00) >> 8;
|
||||
*r = c >> 16;
|
||||
break;
|
||||
case 15:
|
||||
*b = (c & (1 + 2 + 4 + 8 + 16)) << 3;
|
||||
*g = (c & (32 + 64 + 128 + 256 + 512)) >> 2;
|
||||
*r = (c & (1024 + 2048 + 4096 + 8192 + 16384)) >> 7;
|
||||
break;
|
||||
case 16:
|
||||
*b = (c & (1 + 2 + 4 + 8 + 16)) << 3;
|
||||
*g = (c & (32 + 64 + 128 + 256 + 512 + 1024)) >> 3;
|
||||
*r = (c & (2048 + 4096 + 8192 + 16384 + 32768)) >> 8;
|
||||
break;
|
||||
case 4:
|
||||
*b = (c & 1) * ((c & 8) ? 255 : 128);
|
||||
*g = (c & 2) * ((c & 8) ? 255 : 128);
|
||||
*r = (c & 4) * ((c & 8) ? 255 : 128);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void gl_setdisplaystart(int x, int y)
|
||||
{
|
||||
vga_setdisplaystart(y * BYTEWIDTH + x * BYTESPERPIXEL);
|
||||
}
|
||||
|
||||
|
||||
/* Screen copying */
|
||||
|
||||
void gl_setscreenoffset(int o)
|
||||
{
|
||||
screenoffset = o;
|
||||
}
|
||||
|
||||
int gl_enablepageflipping(GraphicsContext * gc)
|
||||
{
|
||||
if (gc->modeflags & MODEFLAG_PAGEFLIPPING_CAPABLE) {
|
||||
gc->modeflags |= MODEFLAG_PAGEFLIPPING_ENABLED;
|
||||
}
|
||||
if (gc->modeflags & MODEFLAG_TRIPLEBUFFERING_CAPABLE) {
|
||||
gc->modeflags &= ~(MODEFLAG_PAGEFLIPPING_ENABLED);
|
||||
gc->modeflags |= MODEFLAG_TRIPLEBUFFERING_ENABLED;
|
||||
}
|
||||
gc->flippage = 0;
|
||||
if (gc->modeflags & MODEFLAG_TRIPLEBUFFERING_ENABLED)
|
||||
return 3;
|
||||
if (gc->modeflags & MODEFLAG_PAGEFLIPPING_ENABLED)
|
||||
return 2;
|
||||
return 0;
|
||||
}
|
||||
#if 0 //有__svgalib_memcpy32shift8,不支持
|
||||
void gl_copyscreen(GraphicsContext * gc)
|
||||
{
|
||||
int size;
|
||||
void *svp, *dvp;
|
||||
|
||||
if (gc->modeflags & MODEFLAG_PAGEFLIPPING_ENABLED)
|
||||
gc->flippage ^= 1;
|
||||
if (gc->modeflags & MODEFLAG_TRIPLEBUFFERING_ENABLED)
|
||||
gc->flippage = (gc->flippage + 1) % 3;
|
||||
if (gc->modeflags & (MODEFLAG_PAGEFLIPPING_ENABLED |
|
||||
MODEFLAG_TRIPLEBUFFERING_ENABLED)) {
|
||||
/* Calculate screen offset in bytes. */
|
||||
screenoffset = gc->bytewidth * HEIGHT * gc->flippage;
|
||||
if (gc->modeflags & MODEFLAG_FLIPPAGE_BANKALIGNED)
|
||||
screenoffset = ((screenoffset + 0xffff) & ~0xffff);
|
||||
}
|
||||
if (gc->modetype == CONTEXT_MODEX) {
|
||||
vga_copytoplanar256(VBUF, BYTEWIDTH, screenoffset / 4,
|
||||
gc->bytewidth / 4, WIDTH, HEIGHT);
|
||||
goto end;
|
||||
}
|
||||
if (gc->modetype == CONTEXT_PLANAR16) {
|
||||
if (WIDTH == 1024 && HEIGHT >= 512 &&
|
||||
((screenoffset / 8) & 0xffff) == 0) {
|
||||
/* Kludge to allow 1024x768x16 with page flipping. */
|
||||
int page;
|
||||
page = (screenoffset / 8) >> 16;
|
||||
vga_setpage(page);
|
||||
vga_copytoplanar16(VBUF, BYTEWIDTH, 0,
|
||||
gc->bytewidth / 8, WIDTH, 512);
|
||||
vga_setpage(page + 1);
|
||||
vga_copytoplanar16(VBUF + WIDTH * 512, BYTEWIDTH,
|
||||
0, gc->bytewidth / 8, WIDTH, HEIGHT - 512);
|
||||
return;
|
||||
}
|
||||
if (WIDTH * HEIGHT >= 512 * 1024)
|
||||
/* We don't handle banking. */
|
||||
return;
|
||||
|
||||
vga_copytoplanar16(VBUF, BYTEWIDTH, screenoffset / 8,
|
||||
gc->bytewidth / 8, WIDTH, HEIGHT);
|
||||
goto end;
|
||||
}
|
||||
if (BYTESPERPIXEL == 4 && gc->bytesperpixel == 3) {
|
||||
/* Special case. */
|
||||
int soffset, doffset;
|
||||
if (BYTEWIDTH / 4 != gc->bytewidth / 3) {
|
||||
/* Even more special case for physical truecolor */
|
||||
/* modes that have extra scanline padding. */
|
||||
/* This has the effect of slowing down */
|
||||
/* '3d' in some truecolor modes on ATI mach32. */
|
||||
gl_copyboxtocontext(0, 0, WIDTH, HEIGHT, gc, 0, 0);
|
||||
goto end;
|
||||
}
|
||||
soffset = 0;
|
||||
doffset = screenoffset;
|
||||
size = WIDTH * HEIGHT;
|
||||
while (soffset / 4 < size) {
|
||||
int schunk, dchunk;
|
||||
int count;
|
||||
schunk = __svgalib_driver_setread(&__currentcontext, soffset, &svp);
|
||||
dchunk = __svgalib_driver_setwrite(gc, doffset, &dvp);
|
||||
if (dchunk == 1) {
|
||||
/* One byte left in segment. */
|
||||
int pix;
|
||||
pix = *(unsigned *) svp; /* 32-bit pixel */
|
||||
*(unsigned char *) dvp = pix;
|
||||
dchunk = __svgalib_driver_setwrite(gc, doffset + 1, &dvp);
|
||||
*(unsigned short *) dvp = pix >> 8;
|
||||
count = 1; /* 1 pixel handled. */
|
||||
} else if (dchunk == 2) {
|
||||
/* Two bytes left. */
|
||||
int pix;
|
||||
pix = *(unsigned *) svp; /* 32-bit pixel */
|
||||
*(unsigned short *) dvp = pix;
|
||||
dchunk = __svgalib_driver_setwrite(gc, doffset + 2, &dvp);
|
||||
*(unsigned char *) dvp = pix >> 16;
|
||||
count = 1; /* 1 pixel handled. */
|
||||
} else {
|
||||
count = min(min(schunk / 4, dchunk / 3),
|
||||
size - (soffset / 4));
|
||||
__svgalib_memcpy4to3(dvp, svp, count);
|
||||
}
|
||||
soffset += count * 4;
|
||||
doffset += count * 3;
|
||||
}
|
||||
goto end;
|
||||
}
|
||||
if (BYTESPERPIXEL == 4 && gc->bytesperpixel == 4 &&
|
||||
(gc->modeflags & MODEFLAG_32BPP_SHIFT8)) {
|
||||
int soffset = 0;
|
||||
int doffset = screenoffset;
|
||||
size = SCREENSIZE(__currentcontext);
|
||||
while (soffset < size) {
|
||||
int schunk, dchunk;
|
||||
int count;
|
||||
schunk = __svgalib_driver_setread(&__currentcontext, soffset, &svp);
|
||||
dchunk = __svgalib_driver_setwrite(gc, doffset, &dvp);
|
||||
count = min(min(schunk, dchunk), (size - soffset));
|
||||
__svgalib_memcpy32shift8(dvp, svp, count / 4);
|
||||
soffset += count;
|
||||
doffset += count;
|
||||
}
|
||||
} else {
|
||||
int soffset = 0;
|
||||
int doffset = screenoffset;
|
||||
size = SCREENSIZE(__currentcontext);
|
||||
while (soffset < size) {
|
||||
int schunk, dchunk;
|
||||
int count;
|
||||
schunk = __svgalib_driver_setread(&__currentcontext, soffset, &svp);
|
||||
dchunk = __svgalib_driver_setwrite(gc, doffset, &dvp);
|
||||
count = min(min(schunk, dchunk), (size - soffset));
|
||||
__memcpy(dvp, svp, count);
|
||||
soffset += count;
|
||||
doffset += count;
|
||||
}
|
||||
}
|
||||
|
||||
end:
|
||||
if (gc->modeflags & (MODEFLAG_PAGEFLIPPING_ENABLED |
|
||||
MODEFLAG_TRIPLEBUFFERING_ENABLED)) {
|
||||
GraphicsContext save;
|
||||
/* setdisplaystart will use BYTEWIDTH of the virtual screen, */
|
||||
/* which is what we want since vga_setdisplaystart is */
|
||||
/* defined in terms of pixel offset (except for hicolor */
|
||||
/* modes, which are defined in terms of bytes). */
|
||||
gl_getcontext(&save);
|
||||
gl_setcontext(gc);
|
||||
if (gc->modeflags & MODEFLAG_FLIPPAGE_BANKALIGNED)
|
||||
vga_setdisplaystart(screenoffset);
|
||||
else
|
||||
gl_setdisplaystart(0, gc->height * gc->flippage);
|
||||
gl_setcontext(&save);
|
||||
/* For page flipping, it might be appropriate to add a */
|
||||
/* waitverticalretrace here. */
|
||||
}
|
||||
screenoffset = 0;
|
||||
}
|
||||
#endif //0
|
||||
#if 0 //有 __svgalib_memcpy4to3,不支持
|
||||
void gl_copyboxtocontext(int x1, int y1, int w, int h, GraphicsContext * gc,
|
||||
int x2, int y2)
|
||||
{
|
||||
/* This is now reasonably efficient if clipping is not enabled. */
|
||||
void *buf;
|
||||
GraphicsContext save;
|
||||
gl_getcontext(&save);
|
||||
if ((MODETYPE == CONTEXT_LINEAR || MODETYPE == CONTEXT_VIRTUAL) &&
|
||||
(BYTESPERPIXEL == gc->bytesperpixel) &&
|
||||
!__clip && !gc->clip) {
|
||||
#ifdef DLL_CONTEXT_SHADOW
|
||||
__currentcontext = *gc;
|
||||
#else
|
||||
gl_setcontext(gc);
|
||||
#endif
|
||||
/*
|
||||
* Note: Using save.bytewidth / BYTESPERPIXEL is probably not an optimal hack here.
|
||||
* it would be better to transfer save.bytewidth to putbox as it is what is really
|
||||
* used there. However, putbox is used all over interpreting the last entry as a
|
||||
* pixel count, so we keep it this way to avoid problems if some other place not
|
||||
* updated by accident.
|
||||
*/
|
||||
putbox(x2, y2 + screenoffset / BYTEWIDTH, w, h, save.vbuf +
|
||||
y1 * save.bytewidth + x1 * BYTESPERPIXEL,
|
||||
save.bytewidth / BYTESPERPIXEL);
|
||||
goto end;
|
||||
}
|
||||
buf = alloca(w * h * BYTESPERPIXEL);
|
||||
gl_getbox(x1, y1, w, h, buf);
|
||||
#ifdef DLL_CONTEXT_SHADOW
|
||||
__currentcontext = *gc;
|
||||
#else
|
||||
gl_setcontext(gc);
|
||||
#endif
|
||||
|
||||
if (save.bytesperpixel == 4 && gc->bytesperpixel == 3) {
|
||||
/* Special case conversion from 32-bit virtual screen to */
|
||||
/* 24-bit truecolor framebuffer. */
|
||||
if (gc->modetype == CONTEXT_PAGED || gc->clip) {
|
||||
/* For paged modes or clipping, use another buffer. */
|
||||
void *buf2;
|
||||
buf2 = alloca(w * h * 3);
|
||||
__svgalib_memcpy4to3(buf2, buf, w * h);
|
||||
gl_putbox(x2, y2 + screenoffset / BYTEWIDTH, w, h,
|
||||
buf2);
|
||||
} else
|
||||
/* No clipping, linear. */
|
||||
__svgalib_driver24_putbox32(x2, y2, w, h, buf, w);
|
||||
} else /* Contexts assumed to have same pixel size. */
|
||||
gl_putbox(x2, y2 + screenoffset / BYTEWIDTH, w, h, buf);
|
||||
|
||||
end:
|
||||
#ifdef DLL_CONTEXT_SHADOW
|
||||
__currentcontext = save;
|
||||
#else
|
||||
gl_setcontext(&save);
|
||||
#endif
|
||||
}
|
||||
|
||||
void gl_copyboxfromcontext(GraphicsContext * gc, int x1, int y1, int w, int h,
|
||||
int x2, int y2)
|
||||
{
|
||||
void *buf;
|
||||
GraphicsContext save;
|
||||
if ((gc->modetype == CONTEXT_LINEAR || gc->modetype == CONTEXT_VIRTUAL) &&
|
||||
(BYTESPERPIXEL == gc->bytesperpixel) &&
|
||||
!__clip && !gc->clip) {
|
||||
/*
|
||||
* see above on gc->bytewidth / BYTESPERPIXEL.
|
||||
*/
|
||||
putbox(x2, y2 + screenoffset / BYTEWIDTH, w, h, gc->vbuf +
|
||||
y1 * gc->bytewidth + x1 * BYTESPERPIXEL,
|
||||
gc->bytewidth / BYTESPERPIXEL);
|
||||
return;
|
||||
}
|
||||
gl_getcontext(&save);
|
||||
#ifdef DLL_CONTEXT_SHADOW
|
||||
__currentcontext = *gc;
|
||||
#else
|
||||
gl_setcontext(gc);
|
||||
#endif
|
||||
buf = alloca(w * h * BYTESPERPIXEL);
|
||||
gl_getbox(x1, y1, w, h, buf);
|
||||
#ifdef DLL_CONTEXT_SHADOW
|
||||
__currentcontext = save;
|
||||
#else
|
||||
gl_setcontext(&save);
|
||||
#endif
|
||||
|
||||
if (gc->bytesperpixel == 4 && save.bytesperpixel == 3) {
|
||||
/* Special case conversion from 32-bit virtual screen to */
|
||||
/* 24-bit truecolor framebuffer. */
|
||||
if (save.modetype == CONTEXT_PAGED || save.clip) {
|
||||
/* For paged modes or clipping, use another buffer. */
|
||||
void *buf2;
|
||||
buf2 = alloca(w * h * 3);
|
||||
__svgalib_memcpy4to3(buf2, buf, w * h);
|
||||
gl_putbox(x2, y2 + screenoffset / BYTEWIDTH, w, h,
|
||||
buf2);
|
||||
} else
|
||||
/* No clipping, linear. */
|
||||
__svgalib_driver24_putbox32(x2, y2, w, h, buf, w);
|
||||
} else /* Contexts assumed to have same pixel size. */
|
||||
gl_putbox(x2, y2 + screenoffset / BYTEWIDTH, w, h, buf);
|
||||
}
|
||||
|
||||
#endif //0
|
|
@ -0,0 +1,53 @@
|
|||
#include "line.h"
|
||||
|
||||
//画横线
|
||||
void draw_h_line(PFBDEV pFbdev,POINT minX,POINT maxX,uint8_t r,uint8_t g,uint8_t b)
|
||||
{
|
||||
int m;
|
||||
POINT tp;
|
||||
|
||||
int length = maxX.x - minX.x;
|
||||
tp.x = minX.x;
|
||||
tp.y = minX.y;
|
||||
for(m = 0;m < length;m++){
|
||||
tp.x++;
|
||||
draw_dot(pFbdev,tp,r,g,b);
|
||||
}
|
||||
}
|
||||
|
||||
void draw_h_line_with_trans(PFBDEV pFbdev,POINT minX,POINT maxX,uint8_t r,uint8_t g,uint8_t b,uint8_t t){
|
||||
int m;
|
||||
|
||||
int length = maxX.x - minX.x;
|
||||
for(m = 0;m < length;m++){
|
||||
POINT tp;
|
||||
tp.x = minX.x + m;
|
||||
tp.y = minX.y;
|
||||
|
||||
draw_dot_with_trans(pFbdev,tp,r,g,b,t);
|
||||
}
|
||||
}
|
||||
|
||||
//画竖线
|
||||
void draw_v_line(PFBDEV pFbdev,POINT minY,POINT maxY,uint8_t r,uint8_t g,uint8_t b)
|
||||
{
|
||||
int m;
|
||||
|
||||
int length = maxY.y - minY.y;
|
||||
for(m = 0;m < length;m++){
|
||||
POINT tp;
|
||||
tp.x = minY.x;
|
||||
tp.y = minY.y + m;
|
||||
|
||||
draw_dot(pFbdev,tp,r,g,b);
|
||||
}
|
||||
}
|
||||
|
||||
//划横线
|
||||
void draw_h_line_with_string(PFBDEV pFbdev,POINT minX,POINT maxX,const char *color)
|
||||
{
|
||||
RGBT rgbt = getRGBT(color);
|
||||
|
||||
draw_h_line_with_trans(pFbdev,minX,maxX,rgbt.r,rgbt.g,rgbt.b,rgbt.t);
|
||||
}
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
/*
|
||||
* 画线的实现
|
||||
* @作者 陈洪波
|
||||
*/
|
||||
|
||||
#ifndef _LINE_H_
|
||||
#define _LINE_H_
|
||||
|
||||
#include "fbtool.h"
|
||||
#include "point.h"
|
||||
|
||||
/*
|
||||
* 指定x值较小的点和x值较大的点,并指定颜色的rgb值画一条横线
|
||||
* @param pFbdev 参考结构体 fbdev
|
||||
* @param minX x较小的点
|
||||
* @param maxX x较大的点
|
||||
* @param r 颜色对应的R值
|
||||
* @param g 颜色对应的G值
|
||||
* @param b 颜色对应的B值
|
||||
* @return void
|
||||
*/
|
||||
void draw_h_line(PFBDEV pFbdev,POINT minX,POINT maxX,uint8_t r,uint8_t g,uint8_t b);
|
||||
|
||||
/*
|
||||
* 指定x值较小的点和x值较大的点,并指定颜色的rgb值和透明度画一条横线
|
||||
* @param pFbdev 参考结构体 fbdev
|
||||
* @param minX x较小的点
|
||||
* @param maxX x较大的点
|
||||
* @param r 颜色对应的R值
|
||||
* @param g 颜色对应的G值
|
||||
* @param b 颜色对应的B值
|
||||
* @param t 颜色对应的透明度
|
||||
* @return void
|
||||
*
|
||||
*/
|
||||
void draw_h_line_with_trans(PFBDEV pFbdev,POINT minX,POINT maxX,uint8_t r,uint8_t g,uint8_t b,uint8_t t);
|
||||
|
||||
/*
|
||||
* 使用字符串作为颜色的表示来画一条横线
|
||||
* @param pFbdev 参考结构体 fbdev
|
||||
* @param minX x较小的点
|
||||
* @param maxX x较大的点
|
||||
* @param color 颜色所对应的字符串
|
||||
* @return void
|
||||
*/
|
||||
void draw_h_line_with_string(PFBDEV pFbdev,POINT minX,POINT maxX,const char *color);
|
||||
|
||||
/*
|
||||
* 指明y最小的一个点和一个y较大的点,并指明RGB值画一条竖线
|
||||
* @param pFbdev 参考结构体 fbdev
|
||||
* @param minY y较小的点
|
||||
* @param maxY y较大的点
|
||||
* @param r 颜色对应的R值
|
||||
* @param g 颜色对应的G值
|
||||
* @param b 颜色对应的B值
|
||||
*/
|
||||
void draw_v_line(PFBDEV pFbdev,POINT minY,POINT maxY,uint8_t r,uint8_t g,uint8_t b);
|
||||
|
||||
|
||||
#endif //_LINE_H_
|
|
@ -0,0 +1,112 @@
|
|||
#ifndef _I386_PAGE_H
|
||||
#define _I386_PAGE_H
|
||||
/* PAGE_SHIFT determines the page size */
|
||||
#define PAGE_SHIFT 12
|
||||
#define PAGE_SIZE (1UL << PAGE_SHIFT)
|
||||
#define PAGE_MASK (~(PAGE_SIZE-1))
|
||||
#define LARGE_PAGE_MASK (~(LARGE_PAGE_SIZE-1))
|
||||
#define LARGE_PAGE_SIZE (1UL << PMD_SHIFT)
|
||||
#ifdef __KERNEL__
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <linux/config.h>
|
||||
#ifdef CONFIG_X86_USE_3DNOW
|
||||
#include <asm/mmx.h>
|
||||
#define clear_page(page) mmx_clear_page((void *)(page))
|
||||
#define copy_page(to,from) mmx_copy_page(to,from)
|
||||
#else
|
||||
/*
|
||||
* On older X86 processors it's not a win to use MMX here it seems.
|
||||
* Maybe the K6-III ?
|
||||
*/
|
||||
#define clear_page(page) memset((void *)(page), 0, PAGE_SIZE)
|
||||
#define copy_page(to,from) memcpy((void *)(to), (void *)(from), PAGE_SIZE)
|
||||
#endif
|
||||
#define clear_user_page(page, vaddr, pg) clear_page(page)
|
||||
#define copy_user_page(to, from, vaddr, pg) copy_page(to, from)
|
||||
/*
|
||||
* These are used to make use of C type-checking..
|
||||
*/
|
||||
#ifdef CONFIG_X86_PAE
|
||||
typedef struct { unsigned long pte_low, pte_high; } pte_t;
|
||||
typedef struct { unsigned long long pmd; } pmd_t;
|
||||
typedef struct { unsigned long long pgd; } pgd_t;
|
||||
#define pte_val(x) ((x).pte_low | ((unsigned long long)(x).pte_high << 32))
|
||||
#define HPAGE_SHIFT 21
|
||||
#else
|
||||
typedef struct { unsigned long pte_low; } pte_t;
|
||||
typedef struct { unsigned long pmd; } pmd_t;
|
||||
typedef struct { unsigned long pgd; } pgd_t;
|
||||
#define boot_pte_t pte_t /* or would you rather have a typedef */
|
||||
#define pte_val(x) ((x).pte_low)
|
||||
#define HPAGE_SHIFT 22
|
||||
#endif
|
||||
#define PTE_MASK PAGE_MASK
|
||||
#ifdef CONFIG_HUGETLB_PAGE
|
||||
#define HPAGE_SIZE ((1UL) << HPAGE_SHIFT)
|
||||
#define HPAGE_MASK (~(HPAGE_SIZE - 1))
|
||||
#define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT)
|
||||
#endif
|
||||
typedef struct { unsigned long pgprot; } pgprot_t;
|
||||
#define pmd_val(x) ((x).pmd)
|
||||
#define pgd_val(x) ((x).pgd)
|
||||
#define pgprot_val(x) ((x).pgprot)
|
||||
#define __pte(x) ((pte_t) { (x) } )
|
||||
#define __pmd(x) ((pmd_t) { (x) } )
|
||||
#define __pgd(x) ((pgd_t) { (x) } )
|
||||
#define __pgprot(x) ((pgprot_t) { (x) } )
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
/* to align the pointer to the (next) page boundary */
|
||||
#define PAGE_ALIGN(addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK)
|
||||
/*
|
||||
* This handles the memory map.. We could make this a config
|
||||
* option, but too many people screw it up, and too few need
|
||||
* it.
|
||||
*
|
||||
* A __PAGE_OFFSET of 0xC0000000 means that the kernel has
|
||||
* a virtual address space of one gigabyte, which limits the
|
||||
* amount of physical memory you can use to about 950MB.
|
||||
*
|
||||
* If you want more physical memory than this then see the CONFIG_HIGHMEM4G
|
||||
* and CONFIG_HIGHMEM64G options in the kernel configuration.
|
||||
*/
|
||||
/*
|
||||
* This much address space is reserved for vmalloc() and iomap()
|
||||
* as well as fixmap mappings.
|
||||
*/
|
||||
#define __VMALLOC_RESERVE (128 << 20)
|
||||
#ifndef __ASSEMBLY__
|
||||
/* Pure 2^n version of get_order */
|
||||
static __inline__ int get_order(unsigned long size)
|
||||
{
|
||||
int order;
|
||||
size = (size-1) >> (PAGE_SHIFT-1);
|
||||
order = -1;
|
||||
do {
|
||||
size >>= 1;
|
||||
order++;
|
||||
} while (size);
|
||||
return order;
|
||||
}
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#ifdef __ASSEMBLY__
|
||||
#define __PAGE_OFFSET (0xC0000000)
|
||||
#else
|
||||
#define __PAGE_OFFSET (0xC0000000UL)
|
||||
#endif
|
||||
#define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET)
|
||||
#define VMALLOC_RESERVE ((unsigned long)__VMALLOC_RESERVE)
|
||||
#define MAXMEM (-__PAGE_OFFSET-__VMALLOC_RESERVE)
|
||||
#define __pa(x) ((unsigned long)(x)-PAGE_OFFSET)
|
||||
#define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET))
|
||||
#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT)
|
||||
#ifndef CONFIG_DISCONTIGMEM
|
||||
#define pfn_to_page(pfn) (mem_map + (pfn))
|
||||
#define page_to_pfn(page) ((unsigned long)((page) - mem_map))
|
||||
#define pfn_valid(pfn) ((pfn) < max_mapnr)
|
||||
#endif /* !CONFIG_DISCONTIGMEM */
|
||||
#define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
|
||||
#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
|
||||
#define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | /
|
||||
VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _I386_PAGE_H */
|
|
@ -0,0 +1,103 @@
|
|||
#ifndef __ASM_GENERIC_PAGE_H
|
||||
#define __ASM_GENERIC_PAGE_H
|
||||
/*
|
||||
* Generic page.h implementation, for NOMMU architectures.
|
||||
* This provides the dummy definitions for the memory management.
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
#error need to prove a real asm/page.h
|
||||
#endif
|
||||
|
||||
|
||||
/* PAGE_SHIFT determines the page size */
|
||||
|
||||
#define PAGE_SHIFT 12
|
||||
#ifdef __ASSEMBLY__
|
||||
#define PAGE_SIZE (1 << PAGE_SHIFT)
|
||||
#else
|
||||
#define PAGE_SIZE (1UL << PAGE_SHIFT)
|
||||
#endif
|
||||
#define PAGE_MASK (~(PAGE_SIZE-1))
|
||||
|
||||
#include <asm/setup.h>
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#define get_user_page(vaddr) __get_free_page(GFP_KERNEL)
|
||||
#define free_user_page(page, addr) free_page(addr)
|
||||
|
||||
#define clear_page(page) memset((page), 0, PAGE_SIZE)
|
||||
#define copy_page(to,from) memcpy((to), (from), PAGE_SIZE)
|
||||
|
||||
#define clear_user_page(page, vaddr, pg) clear_page(page)
|
||||
#define copy_user_page(to, from, vaddr, pg) copy_page(to, from)
|
||||
|
||||
/*
|
||||
* These are used to make use of C type-checking..
|
||||
*/
|
||||
typedef struct {
|
||||
unsigned long pte;
|
||||
} pte_t;
|
||||
typedef struct {
|
||||
unsigned long pmd[16];
|
||||
} pmd_t;
|
||||
typedef struct {
|
||||
unsigned long pgd;
|
||||
} pgd_t;
|
||||
typedef struct {
|
||||
unsigned long pgprot;
|
||||
} pgprot_t;
|
||||
typedef struct page *pgtable_t;
|
||||
|
||||
#define pte_val(x) ((x).pte)
|
||||
#define pmd_val(x) ((&x)->pmd[0])
|
||||
#define pgd_val(x) ((x).pgd)
|
||||
#define pgprot_val(x) ((x).pgprot)
|
||||
|
||||
#define __pte(x) ((pte_t) { (x) } )
|
||||
#define __pmd(x) ((pmd_t) { (x) } )
|
||||
#define __pgd(x) ((pgd_t) { (x) } )
|
||||
#define __pgprot(x) ((pgprot_t) { (x) } )
|
||||
|
||||
extern unsigned long memory_start;
|
||||
extern unsigned long memory_end;
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
#ifdef CONFIG_KERNEL_RAM_BASE_ADDRESS
|
||||
#define PAGE_OFFSET (CONFIG_KERNEL_RAM_BASE_ADDRESS)
|
||||
#else
|
||||
#define PAGE_OFFSET (0)
|
||||
#endif
|
||||
|
||||
#ifndef ARCH_PFN_OFFSET
|
||||
#define ARCH_PFN_OFFSET (PAGE_OFFSET >> PAGE_SHIFT)
|
||||
#endif
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#define __va(x) ((void *)((unsigned long) (x)))
|
||||
#define __pa(x) ((unsigned long) (x))
|
||||
|
||||
#define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT)
|
||||
#define pfn_to_virt(pfn) __va((pfn) << PAGE_SHIFT)
|
||||
|
||||
#define virt_to_page(addr) pfn_to_page(virt_to_pfn(addr))
|
||||
#define page_to_virt(page) pfn_to_virt(page_to_pfn(page))
|
||||
|
||||
#ifndef page_to_phys
|
||||
#define page_to_phys(page) ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT)
|
||||
#endif
|
||||
|
||||
#define pfn_valid(pfn) ((pfn) >= ARCH_PFN_OFFSET && ((pfn) - ARCH_PFN_OFFSET) < max_mapnr)
|
||||
|
||||
#define virt_addr_valid(kaddr) (((void *)(kaddr) >= (void *)PAGE_OFFSET) && \
|
||||
((void *)(kaddr) < (void *)memory_end))
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#include <asm-generic/memory_model.h>
|
||||
#include <asm-generic/getorder.h>
|
||||
|
||||
#endif /* __ASM_GENERIC_PAGE_H */
|
|
@ -0,0 +1,95 @@
|
|||
#include "point.h"
|
||||
|
||||
//画点
|
||||
void draw_dot(PFBDEV pFbdev, POINT p, uint8_t r, uint8_t g, uint8_t b) {
|
||||
uint32_t offset;
|
||||
uint8_t color[2];
|
||||
color[0] = COLOR16(r, g, b) & 0x00FF;
|
||||
color[1] = COLOR16(r, g, b) >> 8;
|
||||
// color[2] = r;
|
||||
// color[3] = 0x0; //透明度
|
||||
|
||||
offset = p.y * pFbdev->fb_fix.line_length + 2 * p.x;
|
||||
//将操作映射到内存中
|
||||
fb_memcpy((void *)pFbdev->fb_mem + pFbdev->fb_mem_offset + offset, color, 2);
|
||||
}
|
||||
|
||||
void draw_dot_c(PFBDEV pFbdev, POINT p, uint16_t c) {
|
||||
uint32_t offset;
|
||||
uint8_t color[2];
|
||||
// color[0] = COLOR16(r, g, b) & 0x00FF;
|
||||
// color[1] = COLOR16(r, g, b) >>8;
|
||||
// color[2] = r;
|
||||
// color[3] = 0x0; //透明度
|
||||
|
||||
offset = p.y * pFbdev->fb_fix.line_length + 2 * p.x;
|
||||
//将操作映射到内存中
|
||||
// fb_memcpy((void *)pFbdev->fb_mem + pFbdev->fb_mem_offset + offset,
|
||||
// color, 2);
|
||||
//
|
||||
long location =
|
||||
(p.x + pFbdev->fb_var.xoffset) * (pFbdev->fb_var.bits_per_pixel / 8) +
|
||||
(p.y + pFbdev->fb_var.yoffset) * pFbdev->fb_fix.line_length;
|
||||
*((uint16_t *)(pFbdev->fb_mem + location)) = c;
|
||||
}
|
||||
|
||||
//画点
|
||||
void draw_dot_with_trans(PFBDEV pFbdev, POINT p, uint8_t r, uint8_t g,
|
||||
uint8_t b, uint8_t t) {
|
||||
uint32_t offset;
|
||||
uint8_t color[4];
|
||||
color[0] = b;
|
||||
color[1] = g;
|
||||
color[2] = r;
|
||||
color[3] = t; //透明度
|
||||
|
||||
offset = p.y * pFbdev->fb_fix.line_length + 4 * p.x;
|
||||
//将操作映射到内存中
|
||||
fb_memcpy((void *)pFbdev->fb_mem + pFbdev->fb_mem_offset + offset, color, 4);
|
||||
}
|
||||
|
||||
//画点
|
||||
void draw_x_y_dot(PFBDEV pFbdev, int x, int y, uint8_t r, uint8_t g,
|
||||
uint8_t b) {
|
||||
POINT p;
|
||||
p.x = x;
|
||||
p.y = y;
|
||||
|
||||
// draw_dot(pFbdev, p, r, g, b);
|
||||
}
|
||||
|
||||
//画点
|
||||
void draw_x_y_dot_with_trans(PFBDEV pFbdev, int x, int y, uint8_t r, uint8_t g,
|
||||
uint8_t b, uint8_t t) {
|
||||
POINT p;
|
||||
p.x = x;
|
||||
p.y = y;
|
||||
|
||||
draw_dot_with_trans(pFbdev, p, r, g, b, t);
|
||||
}
|
||||
|
||||
//画点
|
||||
void draw_x_y_color_dot(PFBDEV pFbdev, int x, int y, RGBT c) {
|
||||
draw_x_y_dot(pFbdev, x, y, c.r, c.g, c.b);
|
||||
}
|
||||
|
||||
//画点
|
||||
void draw_x_y_color_dot_with_trans(PFBDEV pFbdev, int x, int y, RGBT c) {
|
||||
draw_x_y_dot_with_trans(pFbdev, x, y, c.r, c.g, c.b, c.t);
|
||||
}
|
||||
|
||||
//画点 color8位,分别代表RGBT
|
||||
void draw_x_y_color_dot_with_string(PFBDEV pFbdev, int x, int y,
|
||||
const char *temp) {
|
||||
RGBT rgbt = getRGBT(temp);
|
||||
|
||||
draw_x_y_dot_with_trans(pFbdev, x, y, rgbt.r, rgbt.g, rgbt.b, rgbt.t);
|
||||
}
|
||||
|
||||
// 画点 color16位
|
||||
void gl_setpixel(int x, int y, int c)
|
||||
{
|
||||
long location = (x + pFbdev->fb_var.xoffset) * 2 +
|
||||
(y + pFbdev->fb_var.yoffset) * pFbdev->fb_fix.line_length;
|
||||
*((int16_t *)(pFbdev->fb_mem + location)) = c;
|
||||
}
|
|
@ -0,0 +1,96 @@
|
|||
/**
|
||||
* 画点实现
|
||||
* @作者 陈洪波
|
||||
*/
|
||||
|
||||
#ifndef _POINT_H_
|
||||
#define _POINT_H_
|
||||
|
||||
#include "fbtool.h"
|
||||
|
||||
/*
|
||||
* 该函数用于在命令行中画点
|
||||
* @param pFbdev 参考结构体 fbdev
|
||||
* @param p 点的坐标
|
||||
* @param r 颜色对应的R值
|
||||
* @param g 颜色对应的G值
|
||||
* @param b 颜色对应的B值
|
||||
* @return void
|
||||
*/
|
||||
void draw_dot(PFBDEV pFbdev,POINT p,uint8_t r,uint8_t g,uint8_t b);
|
||||
void draw_dot_c(PFBDEV pFbdev, POINT p, uint16_t c);
|
||||
/*
|
||||
* 该函数用于实现画点,不过在这个函数中需要设定透明度参数
|
||||
* @param pFbdev 参考结构体 fbdev
|
||||
* @param p 点的坐标
|
||||
* @param r 颜色对应的R值
|
||||
* @param g 颜色对应的G值
|
||||
* @param b 颜色对应的B值
|
||||
* @param t 颜色对应的透明度值
|
||||
* @return void
|
||||
*/
|
||||
void draw_dot_with_trans(PFBDEV pFbdev, POINT p, uint8_t r, uint8_t g,
|
||||
uint8_t b, uint8_t t);
|
||||
|
||||
/*
|
||||
* 该函数用于指定点的横坐标,纵坐标的值来画点
|
||||
* @param pFbdev 参考结构体 fbdev
|
||||
* @param x 点的坐标对应的横坐标的值
|
||||
* @param y 点的坐标对应的纵坐标的值
|
||||
* @param r 颜色对应的R值
|
||||
* @param g 颜色对应的G值
|
||||
* @param b 颜色对应的B值
|
||||
*/
|
||||
void draw_x_y_dot(PFBDEV pFbdev,int x,int y,uint8_t r,uint8_t g,uint8_t b);
|
||||
|
||||
/*
|
||||
* 该函数用于指定点的横坐标,纵坐标的值,并且必须指明透明度来画点
|
||||
* @param pFbdev 参考结构体 fbdev
|
||||
* @param x 点的坐标对应的横坐标的值
|
||||
* @param y 点的坐标对应的纵坐标的值
|
||||
* @param r 颜色对应的R值
|
||||
* @param g 颜色对应的G值
|
||||
* @param b 颜色对应的B值
|
||||
* @param t 颜色对应的透明度值
|
||||
*/
|
||||
void draw_x_y_dot_with_trans(PFBDEV pFbdev,int x,int y,uint8_t r,uint8_t g,uint8_t b,uint8_t t);
|
||||
|
||||
/*
|
||||
* 该函数指定点的横纵坐标,然后使用结构体rgbt来代替颜色来画点
|
||||
* @param pFbdev 参考结构体 fbdev
|
||||
* @param x 点的坐标对应的横坐标的值
|
||||
* @param y 点的坐标对应的纵坐标的值
|
||||
* @param c 用来代表颜色的结构体
|
||||
* @return void
|
||||
*
|
||||
*/
|
||||
void draw_x_y_color_dot(PFBDEV pFbdev,int x,int y,RGBT c);
|
||||
|
||||
/*
|
||||
* 该函数指定点的横纵坐标,然后使用结构体rgbt来代替颜色来画点,不过在这里指明透明度是有效果
|
||||
* @param pFbdev 参考结构体 fbdev
|
||||
* @param x 点的坐标对应的横坐标的值
|
||||
* @param y 点的坐标对应的纵坐标的值
|
||||
* @param c 用来代表颜色的结构体
|
||||
* @return void
|
||||
*
|
||||
*/
|
||||
void draw_x_y_color_dot_with_trans(PFBDEV pFbdev,int x,int y,RGBT c);
|
||||
|
||||
/*
|
||||
* 该函数指定点的横纵坐标,然后使用八位的字符串来指明颜色来画点
|
||||
* 注意:这里的字符串里面都是16进制的数值,例如,"ffff0000"
|
||||
*
|
||||
* @param pFbdev 参考结构体 fbdev
|
||||
* @param x 点的坐标对应的横坐标的值
|
||||
* @param y 点的坐标对应的纵坐标的值
|
||||
* @param c 用来代表颜色的结构体
|
||||
* @param color 用来指明颜色的字符串
|
||||
* @return void
|
||||
*
|
||||
*/
|
||||
void draw_x_y_color_dot_with_string(PFBDEV pFbdev,int x,int y,const char *color);
|
||||
|
||||
#endif //_POINT_H_
|
||||
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
#include "rectangle.h"
|
||||
|
||||
//画一个矩形框
|
||||
void draw_rec(PFBDEV pFbdev,POINT lu,POINT ld,POINT ru,POINT rd,uint8_t r,uint8_t g,uint8_t b)
|
||||
{
|
||||
draw_h_line(pFbdev,lu,ru,r,g,b);
|
||||
draw_h_line(pFbdev,ld,rd,r,g,b);
|
||||
draw_v_line(pFbdev,lu,ld,r,g,b);
|
||||
draw_v_line(pFbdev,ru,rd,r,g,b);
|
||||
}
|
||||
|
||||
//填充一个矩形框
|
||||
void fill_rec(PFBDEV pFbdev,POINT lu,POINT ld,POINT ru,POINT rd,uint8_t r,uint8_t g,uint8_t b)
|
||||
{
|
||||
int xlen = ru.x - lu.x;
|
||||
int ylen = ld.y - lu.y;
|
||||
|
||||
int m,n;
|
||||
|
||||
for(m = 0;m < ylen;m++){
|
||||
for(n = 0;n < xlen;n++){
|
||||
POINT p;
|
||||
p.x = lu.x + n;
|
||||
p.y = lu.y + m;
|
||||
|
||||
draw_dot(pFbdev,p,r,g,b);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
* 实现画矩形或者是填充矩形
|
||||
* @作者 陈洪波
|
||||
*/
|
||||
|
||||
#ifndef _RECTANGLE_H_
|
||||
#define _RECTANGLE_H_
|
||||
|
||||
#include "fbtool.h"
|
||||
#include "point.h"
|
||||
#include "line.h"
|
||||
|
||||
/*
|
||||
* 画一个矩形框
|
||||
* @param pFbdev 参考结构体 fbdev
|
||||
* @param lu 矩形框左上角的点
|
||||
* @param ld 矩形框左下角的点
|
||||
* @param ru 矩形框右上角的点
|
||||
* @param rd 矩形框右下角的点
|
||||
* @param r 颜色对应的R值
|
||||
* @param g 颜色对应的G值
|
||||
* @param b 颜色对应的B值
|
||||
* @return void
|
||||
*/
|
||||
void draw_rec(PFBDEV pFbdev,POINT lu,POINT ld,POINT ru,POINT rd,uint8_t r,uint8_t g,uint8_t b);
|
||||
|
||||
/*
|
||||
* 填充一个矩形框
|
||||
* @param pFbdev 参考结构体 fbdev
|
||||
* @param lu 矩形框左上角的点
|
||||
* @param ld 矩形框左下角的点
|
||||
* @param ru 矩形框右上角的点
|
||||
* @param rd 矩形框右下角的点
|
||||
* @param r 颜色对应的R值
|
||||
* @param g 颜色对应的G值
|
||||
* @param b 颜色对应的B值
|
||||
* @return void
|
||||
*/
|
||||
void fill_rec(PFBDEV pFbdev,POINT lu,POINT ld,POINT ru,POINT rd,uint8_t r,uint8_t g,uint8_t b);
|
||||
|
||||
|
||||
|
||||
#endif //_RECTANGLE_H_
|
||||
|
|
@ -0,0 +1,150 @@
|
|||
#include "circle.h"
|
||||
#include "line.h"
|
||||
#include "point.h"
|
||||
#include "rectangle.h"
|
||||
|
||||
int main() {
|
||||
FBDEV fbdev;
|
||||
|
||||
memset(&fbdev, 0, sizeof(FBDEV));
|
||||
strcpy(fbdev.dev, "/dev/fb0");
|
||||
|
||||
if (0 == fb_open(&fbdev)) {
|
||||
printf("Open fail!!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
//打印frame buffer 所占内存的开始地址
|
||||
pmem_start(&fbdev);
|
||||
//打印FB_TYPE-c kbd.c
|
||||
p_type(&fbdev);
|
||||
//打印可见清晰度
|
||||
p_visible_res(&fbdev);
|
||||
//打印虚拟分辨率
|
||||
p_virt_res(&fbdev);
|
||||
//打印虚拟到可见的偏移量
|
||||
p_offset(&fbdev);
|
||||
//打印每个像素的位数
|
||||
p_bpp(&fbdev);
|
||||
//打印R,G,B和透明度
|
||||
p_rgbt(&fbdev);
|
||||
//打印在内存中的高度和宽度
|
||||
p_hw(&fbdev);
|
||||
//打印fb的RGB和透明度的位域
|
||||
p_rgbt(&fbdev);
|
||||
|
||||
getchar();
|
||||
|
||||
//清屏
|
||||
clear_con((void *)(fbdev.fb_mem + fbdev.fb_mem_offset), -1,
|
||||
fbdev.fb_fix.smem_len);
|
||||
|
||||
POINT p;
|
||||
p.x = 100;
|
||||
p.y = 100;
|
||||
|
||||
//画点
|
||||
// draw_x_y_dot(&fbdev,100,100,0x0,0xff,0x0);
|
||||
draw_dot(&fbdev, p, 31, 31, 0);
|
||||
|
||||
p.x = 50;
|
||||
p.y = 50;
|
||||
draw_dot_c(&fbdev, p, LT_RED);
|
||||
p.x++;
|
||||
draw_dot_c(&fbdev, p, LT_RED);
|
||||
p.x++;
|
||||
draw_dot_c(&fbdev, p, LT_RED);
|
||||
|
||||
p.x = 100;
|
||||
p.y = 50;
|
||||
draw_dot_c(&fbdev, p, LT_GREEN);
|
||||
p.x++;
|
||||
draw_dot_c(&fbdev, p, LT_GREEN);
|
||||
p.x++;
|
||||
draw_dot_c(&fbdev, p, LT_GREEN);
|
||||
|
||||
p.x = 150;
|
||||
p.y = 50;
|
||||
draw_dot_c(&fbdev, p, LT_BLUE);
|
||||
p.x++;
|
||||
draw_dot_c(&fbdev, p, LT_BLUE);
|
||||
p.x++;
|
||||
draw_dot_c(&fbdev, p, LT_BLUE);
|
||||
|
||||
RGBT c;
|
||||
c.r = 0xff;
|
||||
c.g = 0xff;
|
||||
c.b = 0xff;
|
||||
c.t = 0x00;
|
||||
// draw_x_y_color_dot_with_trans(&fbdev,100,100,RED);
|
||||
// draw_x_y_color_dot_with_string(&fbdev,100,300,YELLOW);
|
||||
|
||||
//划横线
|
||||
//画横线
|
||||
POINT p21;
|
||||
p21.x = 120;
|
||||
p21.y = 100;
|
||||
POINT p2;
|
||||
p2.x = 160;
|
||||
p2.y = 160;
|
||||
// draw_h_line(&fbdev,p21,p2,0x0,0xff,0x0);
|
||||
// draw_h_line_with_string(&fbdev, p21, p2, RED);
|
||||
|
||||
//画竖线
|
||||
POINT p31;
|
||||
p31.x = 100;
|
||||
p31.y = 120;
|
||||
POINT p3;
|
||||
p3.x = 100;
|
||||
p3.y = 160;
|
||||
draw_v_line(&fbdev, p31, p3, 0x0, 0xff, 0x0);
|
||||
|
||||
POINT p40;
|
||||
p40.x = 120;
|
||||
p40.y = 120;
|
||||
POINT p41;
|
||||
p41.x = 160;
|
||||
p41.y = 120;
|
||||
POINT p42;
|
||||
p42.x = 120;
|
||||
p42.y = 160;
|
||||
POINT p43;
|
||||
p43.x = 160;
|
||||
p43.y = 160;
|
||||
//画矩形
|
||||
draw_rec(&fbdev, p40, p42, p41, p43, 0x0, 0xff, 0x0);
|
||||
|
||||
POINT p50;
|
||||
p50.x = 100;
|
||||
p50.y = 180;
|
||||
POINT p51;
|
||||
p51.x = 160;
|
||||
p51.y = 180;
|
||||
POINT p52;
|
||||
p52.x = 100;
|
||||
p52.y = 220;
|
||||
POINT p53;
|
||||
p53.x = 160;
|
||||
p53.y = 220;
|
||||
//填充
|
||||
fill_rec(&fbdev, p50, p52, p51, p53, 0x0, 0xff, 0x0);
|
||||
/*
|
||||
int x = 500;
|
||||
while(1){
|
||||
draw_circle(&fbdev,x,400,100,RED);
|
||||
usleep(100);
|
||||
|
||||
x++;
|
||||
|
||||
if(x == 1200)
|
||||
break;
|
||||
|
||||
clear_con((void *)(fbdev.fb_mem +
|
||||
fbdev.fb_mem_offset),1,fbdev.fb_fix.smem_len);
|
||||
|
||||
}
|
||||
*/
|
||||
fb_close(&fbdev);
|
||||
|
||||
return 0;
|
||||
}
|
Binary file not shown.
|
@ -0,0 +1,7 @@
|
|||
#include "vga.h"
|
||||
|
||||
int vga_init(void)
|
||||
{
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,551 @@
|
|||
/* VGAlib version 1.2 - (c) 1993 Tommy Frandsen */
|
||||
/* */
|
||||
/* This library is free software; you can redistribute it and/or */
|
||||
/* modify it without any restrictions. This library is distributed */
|
||||
/* in the hope that it will be useful, but without any warranty. */
|
||||
|
||||
/* Extended for svgalib by Harm Hanemaayer and Hartmut Schirmer */
|
||||
|
||||
#ifndef VGA_H
|
||||
#define VGA_H
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#define TEXT 0 /* Compatible with VGAlib v1.2 */
|
||||
#define G320x200x16 1
|
||||
#define G640x200x16 2
|
||||
#define G640x350x16 3
|
||||
#define G640x480x16 4
|
||||
#define G320x200x256 5
|
||||
#define G320x240x256 6
|
||||
#define G320x400x256 7
|
||||
#define G360x480x256 8
|
||||
#define G640x480x2 9
|
||||
|
||||
#define G640x480x256 10
|
||||
#define G800x600x256 11
|
||||
#define G1024x768x256 12
|
||||
|
||||
#define G1280x1024x256 13 /* Additional modes. */
|
||||
|
||||
#define G320x200x32K 14
|
||||
#define G320x200x64K 15
|
||||
#define G320x200x16M 16
|
||||
#define G640x480x32K 17
|
||||
#define G640x480x64K 18
|
||||
#define G640x480x16M 19
|
||||
#define G800x600x32K 20
|
||||
#define G800x600x64K 21
|
||||
#define G800x600x16M 22
|
||||
#define G1024x768x32K 23
|
||||
#define G1024x768x64K 24
|
||||
#define G1024x768x16M 25
|
||||
#define G1280x1024x32K 26
|
||||
#define G1280x1024x64K 27
|
||||
#define G1280x1024x16M 28
|
||||
|
||||
#define G800x600x16 29
|
||||
#define G1024x768x16 30
|
||||
#define G1280x1024x16 31
|
||||
|
||||
#define G720x348x2 32 /* Hercules emulation mode */
|
||||
|
||||
#define G320x200x16M32 33 /* 32-bit per pixel modes. */
|
||||
#define G640x480x16M32 34
|
||||
#define G800x600x16M32 35
|
||||
#define G1024x768x16M32 36
|
||||
#define G1280x1024x16M32 37
|
||||
|
||||
/* additional resolutions */
|
||||
#define G1152x864x16 38
|
||||
#define G1152x864x256 39
|
||||
#define G1152x864x32K 40
|
||||
#define G1152x864x64K 41
|
||||
#define G1152x864x16M 42
|
||||
#define G1152x864x16M32 43
|
||||
|
||||
#define G1600x1200x16 44
|
||||
#define G1600x1200x256 45
|
||||
#define G1600x1200x32K 46
|
||||
#define G1600x1200x64K 47
|
||||
#define G1600x1200x16M 48
|
||||
#define G1600x1200x16M32 49
|
||||
|
||||
#define G320x240x256V 50
|
||||
#define G320x240x32K 51
|
||||
#define G320x240x64K 52
|
||||
#define G320x240x16M 53
|
||||
#define G320x240x16M32 54
|
||||
|
||||
#define G400x300x256 55
|
||||
#define G400x300x32K 56
|
||||
#define G400x300x64K 57
|
||||
#define G400x300x16M 58
|
||||
#define G400x300x16M32 59
|
||||
|
||||
#define G512x384x256 60
|
||||
#define G512x384x32K 61
|
||||
#define G512x384x64K 62
|
||||
#define G512x384x16M 63
|
||||
#define G512x384x16M32 64
|
||||
|
||||
#define G960x720x256 65
|
||||
#define G960x720x32K 66
|
||||
#define G960x720x64K 67
|
||||
#define G960x720x16M 68
|
||||
#define G960x720x16M32 69
|
||||
|
||||
#define G1920x1440x256 70
|
||||
#define G1920x1440x32K 71
|
||||
#define G1920x1440x64K 72
|
||||
#define G1920x1440x16M 73
|
||||
#define G1920x1440x16M32 74
|
||||
|
||||
/* The following modes have been introduced by SciTech Display Doctor */
|
||||
|
||||
#define G320x400x256V 75
|
||||
#define G320x400x32K 76
|
||||
#define G320x400x64K 77
|
||||
#define G320x400x16M 78
|
||||
#define G320x400x16M32 79
|
||||
|
||||
#define G640x400x256 80
|
||||
#define G640x400x32K 81
|
||||
#define G640x400x64K 82
|
||||
#define G640x400x16M 83
|
||||
#define G640x400x16M32 84
|
||||
|
||||
#define G320x480x256 85
|
||||
#define G320x480x32K 86
|
||||
#define G320x480x64K 87
|
||||
#define G320x480x16M 88
|
||||
#define G320x480x16M32 89
|
||||
|
||||
#define G720x540x256 90
|
||||
#define G720x540x32K 91
|
||||
#define G720x540x64K 92
|
||||
#define G720x540x16M 93
|
||||
#define G720x540x16M32 94
|
||||
|
||||
#define G848x480x256 95
|
||||
#define G848x480x32K 96
|
||||
#define G848x480x64K 97
|
||||
#define G848x480x16M 98
|
||||
#define G848x480x16M32 99
|
||||
|
||||
#define G1072x600x256 100
|
||||
#define G1072x600x32K 101
|
||||
#define G1072x600x64K 102
|
||||
#define G1072x600x16M 103
|
||||
#define G1072x600x16M32 104
|
||||
|
||||
#define G1280x720x256 105
|
||||
#define G1280x720x32K 106
|
||||
#define G1280x720x64K 107
|
||||
#define G1280x720x16M 108
|
||||
#define G1280x720x16M32 109
|
||||
|
||||
#define G1360x768x256 110
|
||||
#define G1360x768x32K 111
|
||||
#define G1360x768x64K 112
|
||||
#define G1360x768x16M 113
|
||||
#define G1360x768x16M32 114
|
||||
|
||||
#define G1800x1012x256 115
|
||||
#define G1800x1012x32K 116
|
||||
#define G1800x1012x64K 117
|
||||
#define G1800x1012x16M 118
|
||||
#define G1800x1012x16M32 119
|
||||
|
||||
#define G1920x1080x256 120
|
||||
#define G1920x1080x32K 121
|
||||
#define G1920x1080x64K 122
|
||||
#define G1920x1080x16M 123
|
||||
#define G1920x1080x16M32 124
|
||||
|
||||
#define G2048x1152x256 125
|
||||
#define G2048x1152x32K 126
|
||||
#define G2048x1152x64K 127
|
||||
#define G2048x1152x16M 128
|
||||
#define G2048x1152x16M32 129
|
||||
|
||||
#define G2048x1536x256 130
|
||||
#define G2048x1536x32K 131
|
||||
#define G2048x1536x64K 132
|
||||
#define G2048x1536x16M 133
|
||||
#define G2048x1536x16M32 134
|
||||
|
||||
#define G512x480x256 135
|
||||
#define G512x480x32K 136
|
||||
#define G512x480x64K 137
|
||||
#define G512x480x16M 138
|
||||
#define G512x480x16M32 139
|
||||
|
||||
#define G400x600x256 140
|
||||
#define G400x600x32K 141
|
||||
#define G400x600x64K 142
|
||||
#define G400x600x16M 143
|
||||
#define G400x600x16M32 144
|
||||
|
||||
#define __GLASTMODE G400x600x16M32
|
||||
#define GLASTMODE vga_lastmodenumber()
|
||||
|
||||
extern int vga_version;
|
||||
|
||||
extern int vga_setmode(int mode);
|
||||
extern int vga_hasmode(int mode);
|
||||
extern int vga_setflipchar(int c);
|
||||
|
||||
extern int vga_clear(void);
|
||||
extern int vga_flip(void);
|
||||
|
||||
extern int vga_getxdim(void);
|
||||
extern int vga_getydim(void);
|
||||
extern int vga_getcolors(void);
|
||||
|
||||
extern int vga_setpalette(int index, int red, int green, int blue);
|
||||
extern int vga_getpalette(int index, int *red, int *green, int *blue);
|
||||
extern int vga_setpalvec(int start, int num, int *pal);
|
||||
extern int vga_getpalvec(int start, int num, int *pal);
|
||||
|
||||
extern int vga_screenoff(void);
|
||||
extern int vga_screenon(void);
|
||||
|
||||
extern int vga_setcolor(int color);
|
||||
extern int vga_drawpixel(int x, int y);
|
||||
extern int vga_drawline(int x1, int y1, int x2, int y2);
|
||||
extern int vga_drawscanline(int line, unsigned char *colors);
|
||||
extern int vga_drawscansegment(unsigned char *colors, int x, int y, int length);
|
||||
extern int vga_getpixel(int x, int y); /* Added. */
|
||||
extern int vga_getscansegment(unsigned char *colors, int x, int y, int length);
|
||||
|
||||
extern int vga_getch(void);
|
||||
|
||||
extern int vga_dumpregs(void);
|
||||
|
||||
|
||||
/* Extensions to VGAlib v1.2: */
|
||||
|
||||
/* blit flags */
|
||||
#define HAVE_BITBLIT 1
|
||||
#define HAVE_FILLBLIT 2
|
||||
#define HAVE_IMAGEBLIT 4
|
||||
#define HAVE_HLINELISTBLIT 8
|
||||
#define HAVE_BLITWAIT 16
|
||||
|
||||
/* other flags */
|
||||
#define HAVE_RWPAGE 1 /* vga_setreadpage() / vga_setwritepage() available */
|
||||
#define IS_INTERLACED 2 /* mode is interlaced */
|
||||
#define IS_MODEX 4 /* ModeX style 256 colors */
|
||||
#define IS_DYNAMICMODE 8 /* Dynamic defined mode */
|
||||
#define CAPABLE_LINEAR 16 /* Can go to linear addressing mode. */
|
||||
#define IS_LINEAR 32 /* Linear addressing enabled. */
|
||||
#define EXT_INFO_AVAILABLE 64 /* Returned modeinfo contains valid extended fields */
|
||||
#define RGB_MISORDERED 128 /* Mach32 32bpp uses 0BGR instead of BGR0. */
|
||||
/* As of this version 1.25 also used to signal if real RGB
|
||||
(red first in memory) is used instead of BGR (Mach32 DAC 4) */
|
||||
#define HAVE_EXT_SET 256 /* vga_ext_set() available */
|
||||
|
||||
#define IS_IN_STANDARD_VGA_DRIVER(mode) ( \
|
||||
((mode) < G640x480x256) || ((mode) == G720x348x2) )
|
||||
|
||||
typedef struct {
|
||||
int width;
|
||||
int height;
|
||||
int bytesperpixel;
|
||||
int colors;
|
||||
int linewidth; /* scanline width in bytes */
|
||||
int maxlogicalwidth; /* maximum logical scanline width */
|
||||
int startaddressrange; /* changeable bits set */
|
||||
int maxpixels; /* video memory / bytesperpixel */
|
||||
int haveblit; /* mask of blit functions available */
|
||||
int flags; /* other flags */
|
||||
|
||||
/* Extended fields: */
|
||||
|
||||
int chiptype; /* Chiptype detected */
|
||||
int memory; /* videomemory in KB */
|
||||
int linewidth_unit; /* Use only a multiple of this as parameter for set_logicalwidth and
|
||||
set_displaystart */
|
||||
char *linear_aperture; /* points to mmap secondary mem aperture of card (NULL if unavailable) */
|
||||
int aperture_size; /* size of aperture in KB if size>=videomemory. 0 if unavail */
|
||||
void (*set_aperture_page) (int page);
|
||||
/* if aperture_size<videomemory select a memory page */
|
||||
void *extensions; /* points to copy of eeprom for mach32 */
|
||||
/* depends from actual driver/chiptype.. etc. */
|
||||
} vga_modeinfo;
|
||||
|
||||
extern vga_modeinfo *vga_getmodeinfo(int mode);
|
||||
extern int vga_getdefaultmode(void);
|
||||
extern int vga_getcurrentmode(void);
|
||||
extern int vga_getcurrentchipset(void);
|
||||
extern char *vga_getmodename(int mode);
|
||||
extern int vga_getmodenumber(char *name);
|
||||
extern int vga_lastmodenumber(void);
|
||||
extern int vga_getoptmode(int x, int y, int colors, int bytesperpixel, int c);
|
||||
|
||||
extern unsigned char *graph_mem;
|
||||
extern unsigned char *vga_getgraphmem(void);
|
||||
|
||||
extern void vga_setpage(int p);
|
||||
extern void vga_setreadpage(int p);
|
||||
extern void vga_setwritepage(int p);
|
||||
extern void vga_setlogicalwidth(int w);
|
||||
extern void vga_setdisplaystart(int a);
|
||||
extern void vga_waitretrace(void);
|
||||
extern int vga_claimvideomemory(int n);
|
||||
extern void vga_disabledriverreport(void);
|
||||
extern int vga_setmodeX(void);
|
||||
extern int vga_init(void); /* Used to return void in svgalib <= 1.12. */
|
||||
extern int vga_initf(int);
|
||||
extern int vga_getmousetype(void);
|
||||
extern int vga_getmonitortype(void);
|
||||
extern void vga_setmousesupport(int s);
|
||||
extern void vga_lockvc(void);
|
||||
extern void vga_unlockvc(void);
|
||||
extern int vga_getkey(void);
|
||||
extern int vga_oktowrite(void);
|
||||
extern void vga_copytoplanar256(unsigned char *virtualp, int pitch,
|
||||
int voffset, int vpitch, int w, int h);
|
||||
extern void vga_copytoplanar16(unsigned char *virtualp, int pitch,
|
||||
int voffset, int vpitch, int w, int h);
|
||||
extern void vga_copytoplane(unsigned char *virtualp, int pitch,
|
||||
int voffset, int vpitch, int w, int h, int plane);
|
||||
extern int vga_setlinearaddressing(void);
|
||||
extern void vga_safety_fork(void (*shutdown_routine) (void));
|
||||
|
||||
extern int vga_simple_init(void);
|
||||
extern void vga_chipset_saveregs(unsigned char *);
|
||||
extern void vga_chipset_setregs(unsigned char *);
|
||||
|
||||
#ifdef EGA /* Kernel headers may define this. */
|
||||
#undef EGA
|
||||
#endif
|
||||
|
||||
#define UNDEFINED 0
|
||||
#define VGA 1
|
||||
#define ET4000 2
|
||||
#define CIRRUS 3
|
||||
#define TVGA8900 4
|
||||
#define OAK 5
|
||||
#define EGA 6
|
||||
#define S3 7
|
||||
#define ET3000 8
|
||||
#define MACH32 9
|
||||
#define GVGA6400 10
|
||||
#define ARK 11
|
||||
#define ATI 12
|
||||
#define ALI 13
|
||||
#define MACH64 14
|
||||
#define CHIPS 15
|
||||
#define APM 16
|
||||
#define NV3 17
|
||||
#define ET6000 18
|
||||
#define VESA 19
|
||||
#define MX 20
|
||||
#define PARADISE 21
|
||||
#define RAGE 22
|
||||
#define BANSHEE 23
|
||||
#define SIS 24
|
||||
#define I740 25
|
||||
#define NEOMAGIC 26
|
||||
#define LAGUNA 27
|
||||
#define FBDEV 28
|
||||
#define G400 29
|
||||
#define R128 30
|
||||
#define SAVAGE 31
|
||||
|
||||
/* Hor. sync: */
|
||||
#define MON640_60 0 /* 31.5 KHz (standard VGA) */
|
||||
#define MON800_56 1 /* 35.1 KHz (old SVGA) */
|
||||
#define MON1024_43I 2 /* 35.5 KHz (low-end SVGA, 8514) */
|
||||
#define MON800_60 3 /* 37.9 KHz (SVGA) */
|
||||
#define MON1024_60 4 /* 48.3 KHz (SVGA non-interlaced) */
|
||||
#define MON1024_70 5 /* 56.0 KHz (SVGA high frequency) */
|
||||
#define MON1024_72 6
|
||||
|
||||
extern void vga_setchipset(int c);
|
||||
extern void vga_setchipsetandfeatures(int c, int par1, int par2);
|
||||
extern void vga_gettextfont(void *font);
|
||||
extern void vga_puttextfont(void *font);
|
||||
extern void vga_settextmoderegs(void *regs);
|
||||
extern void vga_gettextmoderegs(void *regs);
|
||||
|
||||
extern int vga_white(void);
|
||||
extern int vga_setegacolor(int c);
|
||||
extern int vga_setrgbcolor(int r, int g, int b);
|
||||
|
||||
extern void vga_bitblt(int srcaddr, int destaddr, int w, int h, int pitch);
|
||||
extern void vga_imageblt(void *srcaddr, int destaddr, int w, int h, int pitch);
|
||||
extern void vga_fillblt(int destaddr, int w, int h, int pitch, int c);
|
||||
extern void vga_hlinelistblt(int ymin, int n, int *xmin, int *xmax, int pitch, int c);
|
||||
extern void vga_blitwait(void);
|
||||
extern int vga_ext_set(unsigned what,...);
|
||||
extern int vga_accel(unsigned operation,...);
|
||||
|
||||
extern int vga_setcrtcregs(unsigned char *);
|
||||
extern int vga_getcrtcregs(unsigned char *);
|
||||
|
||||
extern int vga_addtiming(int pixelClock,
|
||||
int HDisplay,
|
||||
int HSyncStart,
|
||||
int HSyncEnd,
|
||||
int HTotal,
|
||||
int VDisplay,
|
||||
int VSyncStart,
|
||||
int VSyncEnd,
|
||||
int VTotal,
|
||||
int flags);
|
||||
|
||||
extern int vga_changetiming(int pixelClock,
|
||||
int HDisplay,
|
||||
int HSyncStart,
|
||||
int HSyncEnd,
|
||||
int HTotal,
|
||||
int VDisplay,
|
||||
int VSyncStart,
|
||||
int VSyncEnd,
|
||||
int VTotal,
|
||||
int flags);
|
||||
|
||||
extern int vga_getcurrenttiming(int *pixelClock,
|
||||
int *HDisplay,
|
||||
int *HSyncStart,
|
||||
int *HSyncEnd,
|
||||
int *HTotal,
|
||||
int *VDisplay,
|
||||
int *VSyncStart,
|
||||
int *VSyncEnd,
|
||||
int *VTotal,
|
||||
int *flags);
|
||||
|
||||
extern int vga_addmode(int xdim, int ydim, int cols,
|
||||
int xbytes, int bytespp);
|
||||
|
||||
extern int vga_guesstiming(int x, int y, int clue, int arg);
|
||||
|
||||
/* Valid values for what in vga_ext_set: */
|
||||
#define VGA_EXT_AVAILABLE 0 /* supported flags */
|
||||
#define VGA_EXT_SET 1 /* set flag(s) */
|
||||
#define VGA_EXT_CLEAR 2 /* clear flag(s) */
|
||||
#define VGA_EXT_RESET 3 /* set/clear flag(s) */
|
||||
#define VGA_EXT_PAGE_OFFSET 4 /* set an offset for all subsequent vga_set*page() calls */
|
||||
/* Like: vga_ext_set(VGA_EXT_PAGE_OFFSET, 42); */
|
||||
/* returns the previous offset value. */
|
||||
#define VGA_EXT_FONT_SIZE 5 /* the (maximal) size of the font buffer */
|
||||
|
||||
/* Valid params for VGA_EXT_AVAILABLE: */
|
||||
#define VGA_AVAIL_SET 0 /* vga_ext_set sub funcs */
|
||||
#define VGA_AVAIL_ACCEL 1 /* vga_accel sub funcs */
|
||||
#define VGA_AVAIL_FLAGS 2 /* known flags for VGA_EXT_SET */
|
||||
#define VGA_AVAIL_ROP 3 /* vga_accel ROP sub funcs */
|
||||
#define VGA_AVAIL_TRANSPARENCY 4 /* vga_accel TRANSPARENCY sub funcs */
|
||||
#define VGA_AVAIL_ROPMODES 5 /* vga_accel ROP modes supported funcs */
|
||||
#define VGA_AVAIL_TRANSMODES 6 /* vga_accel TRANSPARENCY modes supported */
|
||||
|
||||
/* Known flags to vga_ext_set() */
|
||||
#define VGA_CLUT8 1 /* 8 bit DAC entries */
|
||||
|
||||
/* Acceleration interface. */
|
||||
|
||||
/* Accel operations. */
|
||||
#define ACCEL_FILLBOX 1 /* Simple solid fill. */
|
||||
#define ACCEL_SCREENCOPY 2 /* Simple screen-to-screen BLT. */
|
||||
#define ACCEL_PUTIMAGE 3 /* Straight image transfer. */
|
||||
#define ACCEL_DRAWLINE 4 /* General line draw. */
|
||||
#define ACCEL_SETFGCOLOR 5 /* Set foreground color. */
|
||||
#define ACCEL_SETBGCOLOR 6 /* Set background color. */
|
||||
#define ACCEL_SETTRANSPARENCY 7 /* Set transparency mode. */
|
||||
#define ACCEL_SETRASTEROP 8 /* Set raster-operation. */
|
||||
#define ACCEL_PUTBITMAP 9 /* Color-expand bitmap. */
|
||||
#define ACCEL_SCREENCOPYBITMAP 10 /* Color-expand from screen. */
|
||||
#define ACCEL_DRAWHLINELIST 11 /* Draw horizontal spans. */
|
||||
#define ACCEL_SETMODE 12 /* Set blit strategy. */
|
||||
#define ACCEL_SYNC 13 /* Wait for blits to finish. */
|
||||
#define ACCEL_SETOFFSET 14 /* Set screen offset */
|
||||
#define ACCEL_SCREENCOPYMONO 15 /* Monochrome screen-to-screen BLT. */
|
||||
#define ACCEL_POLYLINE 16 /* Draw multiple lines. */
|
||||
#define ACCEL_POLYHLINE 17 /* Draw multiple horizontal spans. */
|
||||
#define ACCEL_POLYFILLMODE 18 /* Set polygon mode. */
|
||||
|
||||
/* Corresponding bitmask. */
|
||||
#define ACCELFLAG_FILLBOX 0x1 /* Simple solid fill. */
|
||||
#define ACCELFLAG_SCREENCOPY 0x2 /* Simple screen-to-screen BLT. */
|
||||
#define ACCELFLAG_PUTIMAGE 0x4 /* Straight image transfer. */
|
||||
#define ACCELFLAG_DRAWLINE 0x8 /* General line draw. */
|
||||
#define ACCELFLAG_SETFGCOLOR 0x10 /* Set foreground color. */
|
||||
#define ACCELFLAG_SETBGCOLOR 0x20 /* Set background color. */
|
||||
#define ACCELFLAG_SETTRANSPARENCY 0x40 /* Set transparency mode. */
|
||||
#define ACCELFLAG_SETRASTEROP 0x80 /* Set raster-operation. */
|
||||
#define ACCELFLAG_PUTBITMAP 0x100 /* Color-expand bitmap. */
|
||||
#define ACCELFLAG_SCREENCOPYBITMAP 0x200 /* Color-exand from screen. */
|
||||
#define ACCELFLAG_DRAWHLINELIST 0x400 /* Draw horizontal spans. */
|
||||
#define ACCELFLAG_SETMODE 0x800 /* Set blit strategy. */
|
||||
#define ACCELFLAG_SYNC 0x1000 /* Wait for blits to finish. */
|
||||
#define ACCELFLAG_SETOFFSET 0x2000 /* Set screen offset */
|
||||
#define ACCELFLAG_SCREENCOPYMONO 0x4000 /* Monochrome screen-to-screen BLT. */
|
||||
#define ACCELFLAG_POLYLINE 0x8000 /* Draw multiple lines. */
|
||||
#define ACCELFLAG_POLYHLINE 0x10000 /* Draw multiple horizontal spans. */
|
||||
#define ACCELFLAG_POLYFILLMODE 0x20000 /* Set polygon mode. */
|
||||
|
||||
/* Mode for SetTransparency. */
|
||||
#define DISABLE_TRANSPARENCY_COLOR 0
|
||||
#define ENABLE_TRANSPARENCY_COLOR 1
|
||||
#define DISABLE_BITMAP_TRANSPARENCY 2
|
||||
#define ENABLE_BITMAP_TRANSPARENCY 3
|
||||
|
||||
/* Flags for SetMode (accelerator interface). */
|
||||
#define BLITS_SYNC 0
|
||||
#define BLITS_IN_BACKGROUND 0x1
|
||||
|
||||
/* Raster ops. */
|
||||
#define ROP_COPY 0 /* Straight copy. */
|
||||
#define ROP_OR 1 /* Source OR destination. */
|
||||
#define ROP_AND 2 /* Source AND destination. */
|
||||
#define ROP_XOR 3 /* Source XOR destination. */
|
||||
#define ROP_INVERT 4 /* Invert destination. */
|
||||
|
||||
/* For the poly funcs */
|
||||
#define ACCEL_START 1
|
||||
#define ACCEL_END 2
|
||||
|
||||
/*
|
||||
* wait for keypress, mousemove, I/O, timeout. cf. select (3) for details on
|
||||
* all parameters execept which.
|
||||
* NULL is a valid argument for any of the ptrs.
|
||||
*/
|
||||
|
||||
extern int vga_waitevent(int which, fd_set * in, fd_set * out, fd_set * except,
|
||||
struct timeval *timeout);
|
||||
|
||||
/*
|
||||
* valid values for what ( | is valid to combine them )
|
||||
*/
|
||||
#define VGA_MOUSEEVENT 1
|
||||
#define VGA_KEYEVENT 2
|
||||
|
||||
/*
|
||||
* return value >= has bits set for mouse/keyboard events detected.
|
||||
* mouse and raw keyboard events are already handled and their bits removed
|
||||
* from *in when vga_waitevent returns.
|
||||
* VGA_KEYEVENT relates to vga_getch NOT vga_getkey.
|
||||
* return values < 0 signal errors. In this case check errno.
|
||||
*/
|
||||
|
||||
/* Background running */
|
||||
extern void vga_runinbackground(int stat, ...);
|
||||
#define VGA_GOTOBACK -1
|
||||
#define VGA_COMEFROMBACK -2
|
||||
extern int vga_runinbackground_version(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif /* VGA_H */
|
|
@ -0,0 +1,188 @@
|
|||
/* Graphics Library headerfile */
|
||||
|
||||
#ifndef VGAGL_H
|
||||
#define VGAGL_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
|
||||
/* Graphics context */
|
||||
|
||||
#define CONTEXT_VIRTUAL 0x0
|
||||
#define CONTEXT_PAGED 0x1
|
||||
#define CONTEXT_LINEAR 0x2
|
||||
#define CONTEXT_MODEX 0x3
|
||||
#define CONTEXT_PLANAR16 0x4
|
||||
|
||||
#define MODEFLAG_PAGEFLIPPING_CAPABLE 0x01
|
||||
#define MODEFLAG_TRIPLEBUFFERING_CAPABLE 0x02
|
||||
#define MODEFLAG_PAGEFLIPPING_ENABLED 0x04
|
||||
#define MODEFLAG_TRIPLEBUFFERING_ENABLED 0x08
|
||||
#define MODEFLAG_FLIPPAGE_BANKALIGNED 0x10
|
||||
/*
|
||||
* The next two can never occur together, thus we use the same flag
|
||||
* (as svgalib does).
|
||||
*/
|
||||
#define MODEFLAG_32BPP_SHIFT8 0x20
|
||||
#define MODEFLAG_24BPP_REVERSED 0x20
|
||||
|
||||
typedef struct {
|
||||
void (*driver_setpixel_func) (int, int, int);
|
||||
int (*driver_getpixel_func) (int, int);
|
||||
void (*driver_hline_func) (int, int, int, int);
|
||||
void (*driver_fillbox_func) (int, int, int, int, int);
|
||||
void (*driver_putbox_func) (int, int, int, int, void *, int);
|
||||
void (*driver_getbox_func) (int, int, int, int, void *, int);
|
||||
void (*driver_putboxmask_func) (int, int, int, int, void *);
|
||||
void (*driver_putboxpart_func) (int, int, int, int, int, int, void *,
|
||||
int, int);
|
||||
void (*driver_getboxpart_func) (int, int, int, int, int, int, void *,
|
||||
int, int);
|
||||
void (*driver_copybox_func) (int, int, int, int, int, int);
|
||||
} framebufferfunctions;
|
||||
|
||||
typedef struct {
|
||||
unsigned char modetype; /* virtual, paged, linear, mode X */
|
||||
unsigned char modeflags; /* or planar16 */
|
||||
unsigned char dummy;
|
||||
unsigned char flippage;
|
||||
int width; /* width in pixels */
|
||||
int height; /* height in pixels */
|
||||
int bytesperpixel; /* bytes per pixel (1, 2, 3, or 4) */
|
||||
int colors; /* number of colors */
|
||||
int bitsperpixel; /* bits per pixel (8, 15, 16 or 24) */
|
||||
int bytewidth; /* length of a scanline in bytes */
|
||||
unsigned char *vbuf; /* address of framebuffer */
|
||||
int clip; /* clipping enabled? */
|
||||
int clipx1; /* top-left coordinate of clip window */
|
||||
int clipy1;
|
||||
int clipx2; /* bottom-right coordinate of clip window */
|
||||
int clipy2;
|
||||
framebufferfunctions ff;
|
||||
} GraphicsContext;
|
||||
|
||||
extern GraphicsContext currentcontext;
|
||||
|
||||
#define BYTESPERPIXEL (currentcontext.bytesperpixel)
|
||||
#define BYTEWIDTH (currentcontext.bytewidth)
|
||||
#define WIDTH (currentcontext.width)
|
||||
#define HEIGHT (currentcontext.height)
|
||||
#define VBUF (currentcontext.vbuf)
|
||||
#define MODETYPE (currentcontext.modetype)
|
||||
#define MODEFLAGS (currentcontext.modeflags)
|
||||
#define BITSPERPIXEL (currentcontext.bitsperpixel)
|
||||
#define COLORS (currentcontext.colors)
|
||||
|
||||
#define __clip (currentcontext.clip)
|
||||
#define __clipx1 (currentcontext.clipx1)
|
||||
#define __clipy1 (currentcontext.clipy1)
|
||||
#define __clipx2 (currentcontext.clipx2)
|
||||
#define __clipy2 (currentcontext.clipy2)
|
||||
|
||||
|
||||
/* Configuration */
|
||||
|
||||
int gl_setcontextvga(int m);
|
||||
int gl_setcontextvgavirtual(int m);
|
||||
void gl_setcontextvirtual(int w, int h, int bpp, int bitspp, void *vbuf);
|
||||
void gl_setcontextwidth(int w);
|
||||
void gl_setcontextheight(int h);
|
||||
GraphicsContext *gl_allocatecontext(void);
|
||||
void gl_setcontext(GraphicsContext * gc);
|
||||
void gl_getcontext(GraphicsContext * gc);
|
||||
void gl_freecontext(GraphicsContext * gc);
|
||||
|
||||
/* Line drawing */
|
||||
|
||||
void gl_setpixel(int x, int y, int c);
|
||||
void gl_setpixelrgb(int x, int y, int r, int g, int b);
|
||||
int gl_getpixel(int x, int y);
|
||||
void gl_getpixelrgb(int x, int y, int *r, int *g, int *b);
|
||||
int gl_rgbcolor(int r, int g, int b);
|
||||
void gl_hline(int x1, int y, int x2, int c);
|
||||
void gl_line(int x1, int y1, int x2, int y2, int c);
|
||||
void gl_circle(int x, int y, int r, int c);
|
||||
void gl_fillcircle(int sx, int sy, int r, int c);
|
||||
void gl_bcircle(int sx, int sy, int r, int c, int fill);
|
||||
|
||||
/* Box (bitmap) functions */
|
||||
|
||||
void gl_fillbox(int x, int y, int w, int h, int c);
|
||||
void gl_getbox(int x, int y, int w, int h, void *dp);
|
||||
void gl_putbox(int x, int y, int w, int h, void *dp);
|
||||
void gl_putboxpart(int x, int y, int w, int h, int bw, int bh, void *b,
|
||||
int xo, int yo);
|
||||
void gl_putboxmask(int x, int y, int w, int h, void *dp);
|
||||
void gl_copybox(int x1, int y1, int w, int h, int x2, int y2);
|
||||
void gl_copyboxtocontext(int x1, int y1, int w, int h, GraphicsContext * gc,
|
||||
int x2, int y2);
|
||||
void gl_copyboxfromcontext(GraphicsContext * gc, int x1, int y1, int w, int h,
|
||||
int x2, int y2);
|
||||
/* The following functions only work in 256-color modes: */
|
||||
void gl_compileboxmask(int w, int h, void *sdp, void *ddp);
|
||||
int gl_compiledboxmasksize(int w, int h, void *sdp);
|
||||
void gl_putboxmaskcompiled(int x, int y, int w, int h, void *dp);
|
||||
|
||||
/* Miscellaneous */
|
||||
|
||||
void gl_clearscreen(int c);
|
||||
void gl_scalebox(int w1, int h1, void *sb, int w2, int h2, void *db);
|
||||
void gl_setdisplaystart(int x, int y);
|
||||
void gl_enableclipping(void);
|
||||
void gl_setclippingwindow(int x1, int y1, int x2, int y2);
|
||||
void gl_disableclipping(void);
|
||||
|
||||
/* Screen buffering */
|
||||
|
||||
void gl_copyscreen(GraphicsContext * gc);
|
||||
void gl_setscreenoffset(int o);
|
||||
int gl_enablepageflipping(GraphicsContext * gc);
|
||||
|
||||
/* Text */
|
||||
|
||||
/* Writemode flags. */
|
||||
#define WRITEMODE_OVERWRITE 0
|
||||
#define WRITEMODE_MASKED 1
|
||||
#define FONT_EXPANDED 0
|
||||
#define FONT_COMPRESSED 2
|
||||
|
||||
void gl_expandfont(int fw, int fh, int c, void *sfdp, void *dfdp);
|
||||
void gl_setfont(int fw, int fh, void *fdp);
|
||||
void gl_colorfont(int fw, int fh, int c, void *fdp);
|
||||
void gl_setwritemode(int wm);
|
||||
void gl_write(int x, int y, char *s);
|
||||
void gl_writen(int x, int y, int n, char *s);
|
||||
void gl_setfontcolors(int bg, int fg);
|
||||
|
||||
/* gl_printf is only available in ELF libraries!! */
|
||||
int gl_printf(int x, int y, const char *fmt,...);
|
||||
|
||||
extern unsigned char *gl_font8x8; /* compressed 8x8 font */
|
||||
|
||||
/* 256-color Palette */
|
||||
|
||||
typedef struct {
|
||||
struct {
|
||||
unsigned char red; /* 6-bit values */
|
||||
unsigned char green;
|
||||
unsigned char blue;
|
||||
} color[256];
|
||||
} Palette;
|
||||
|
||||
void gl_setpalettecolor(int c, int r, int b, int g);
|
||||
void gl_getpalettecolor(int c, int *r, int *b, int *g);
|
||||
void gl_setpalettecolors(int s, int n, void *dp);
|
||||
void gl_getpalettecolors(int s, int n, void *dp);
|
||||
void gl_setpalette(void *p);
|
||||
void gl_getpalette(void *p);
|
||||
void gl_setrgbpalette(void);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
|
@ -0,0 +1,198 @@
|
|||
/* Keyboard interface for svgalib. */
|
||||
/* Can be used independently. */
|
||||
|
||||
#ifndef VGAKEYBOARD_H
|
||||
#define VGAKEYBOARD_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#define SCANCODE_ESCAPE 1
|
||||
|
||||
#define SCANCODE_1 2
|
||||
#define SCANCODE_2 3
|
||||
#define SCANCODE_3 4
|
||||
#define SCANCODE_4 5
|
||||
#define SCANCODE_5 6
|
||||
#define SCANCODE_6 7
|
||||
#define SCANCODE_7 8
|
||||
#define SCANCODE_8 9
|
||||
#define SCANCODE_9 10
|
||||
#define SCANCODE_0 11
|
||||
|
||||
#define SCANCODE_MINUS 12
|
||||
#define SCANCODE_EQUAL 13
|
||||
|
||||
#define SCANCODE_BACKSPACE 14
|
||||
#define SCANCODE_TAB 15
|
||||
|
||||
#define SCANCODE_Q 16
|
||||
#define SCANCODE_W 17
|
||||
#define SCANCODE_E 18
|
||||
#define SCANCODE_R 19
|
||||
#define SCANCODE_T 20
|
||||
#define SCANCODE_Y 21
|
||||
#define SCANCODE_U 22
|
||||
#define SCANCODE_I 23
|
||||
#define SCANCODE_O 24
|
||||
#define SCANCODE_P 25
|
||||
#define SCANCODE_BRACKET_LEFT 26
|
||||
#define SCANCODE_BRACKET_RIGHT 27
|
||||
|
||||
#define SCANCODE_ENTER 28
|
||||
|
||||
#define SCANCODE_LEFTCONTROL 29
|
||||
|
||||
#define SCANCODE_A 30
|
||||
#define SCANCODE_S 31
|
||||
#define SCANCODE_D 32
|
||||
#define SCANCODE_F 33
|
||||
#define SCANCODE_G 34
|
||||
#define SCANCODE_H 35
|
||||
#define SCANCODE_J 36
|
||||
#define SCANCODE_K 37
|
||||
#define SCANCODE_L 38
|
||||
#define SCANCODE_SEMICOLON 39
|
||||
#define SCANCODE_APOSTROPHE 40
|
||||
#define SCANCODE_GRAVE 41
|
||||
|
||||
#define SCANCODE_LEFTSHIFT 42
|
||||
#define SCANCODE_BACKSLASH 43
|
||||
|
||||
#define SCANCODE_Z 44
|
||||
#define SCANCODE_X 45
|
||||
#define SCANCODE_C 46
|
||||
#define SCANCODE_V 47
|
||||
#define SCANCODE_B 48
|
||||
#define SCANCODE_N 49
|
||||
#define SCANCODE_M 50
|
||||
#define SCANCODE_COMMA 51
|
||||
#define SCANCODE_PERIOD 52
|
||||
#define SCANCODE_SLASH 53
|
||||
|
||||
#define SCANCODE_RIGHTSHIFT 54
|
||||
#define SCANCODE_KEYPADMULTIPLY 55
|
||||
|
||||
#define SCANCODE_LEFTALT 56
|
||||
#define SCANCODE_SPACE 57
|
||||
#define SCANCODE_CAPSLOCK 58
|
||||
|
||||
#define SCANCODE_F1 59
|
||||
#define SCANCODE_F2 60
|
||||
#define SCANCODE_F3 61
|
||||
#define SCANCODE_F4 62
|
||||
#define SCANCODE_F5 63
|
||||
#define SCANCODE_F6 64
|
||||
#define SCANCODE_F7 65
|
||||
#define SCANCODE_F8 66
|
||||
#define SCANCODE_F9 67
|
||||
#define SCANCODE_F10 68
|
||||
|
||||
#define SCANCODE_NUMLOCK 69
|
||||
#define SCANCODE_SCROLLLOCK 70
|
||||
|
||||
#define SCANCODE_KEYPAD7 71
|
||||
#define SCANCODE_CURSORUPLEFT 71
|
||||
#define SCANCODE_KEYPAD8 72
|
||||
#define SCANCODE_CURSORUP 72
|
||||
#define SCANCODE_KEYPAD9 73
|
||||
#define SCANCODE_CURSORUPRIGHT 73
|
||||
#define SCANCODE_KEYPADMINUS 74
|
||||
#define SCANCODE_KEYPAD4 75
|
||||
#define SCANCODE_CURSORLEFT 75
|
||||
#define SCANCODE_KEYPAD5 76
|
||||
#define SCANCODE_KEYPAD6 77
|
||||
#define SCANCODE_CURSORRIGHT 77
|
||||
#define SCANCODE_KEYPADPLUS 78
|
||||
#define SCANCODE_KEYPAD1 79
|
||||
#define SCANCODE_CURSORDOWNLEFT 79
|
||||
#define SCANCODE_KEYPAD2 80
|
||||
#define SCANCODE_CURSORDOWN 80
|
||||
#define SCANCODE_KEYPAD3 81
|
||||
#define SCANCODE_CURSORDOWNRIGHT 81
|
||||
#define SCANCODE_KEYPAD0 82
|
||||
#define SCANCODE_KEYPADPERIOD 83
|
||||
|
||||
#define SCANCODE_LESS 86
|
||||
|
||||
#define SCANCODE_F11 87
|
||||
#define SCANCODE_F12 88
|
||||
|
||||
#define SCANCODE_KEYPADENTER 96
|
||||
#define SCANCODE_RIGHTCONTROL 97
|
||||
#define SCANCODE_CONTROL 97
|
||||
#define SCANCODE_KEYPADDIVIDE 98
|
||||
#define SCANCODE_PRINTSCREEN 99
|
||||
#define SCANCODE_RIGHTALT 100
|
||||
#define SCANCODE_BREAK 101 /* Beware: is 119 */
|
||||
#define SCANCODE_BREAK_ALTERNATIVE 119 /* on some keyboards! */
|
||||
|
||||
#define SCANCODE_HOME 102
|
||||
#define SCANCODE_CURSORBLOCKUP 103 /* Cursor key block */
|
||||
#define SCANCODE_PAGEUP 104
|
||||
#define SCANCODE_CURSORBLOCKLEFT 105 /* Cursor key block */
|
||||
#define SCANCODE_CURSORBLOCKRIGHT 106 /* Cursor key block */
|
||||
#define SCANCODE_END 107
|
||||
#define SCANCODE_CURSORBLOCKDOWN 108 /* Cursor key block */
|
||||
#define SCANCODE_PAGEDOWN 109
|
||||
#define SCANCODE_INSERT 110
|
||||
#define SCANCODE_REMOVE 111
|
||||
|
||||
#define SCANCODE_RIGHTWIN 126
|
||||
#define SCANCODE_LEFTWIN 125
|
||||
|
||||
#define KEY_EVENTRELEASE 0
|
||||
#define KEY_EVENTPRESS 1
|
||||
|
||||
#define MAX_KEYNAME_LEN 20
|
||||
|
||||
/* Initialize keyboard handler (brings keyboard into RAW mode). Returns */
|
||||
/* 0 if succesful, -1 otherwise. */
|
||||
int keyboard_init(void);
|
||||
/* Similar, but returns console fd if succesful. */
|
||||
int keyboard_init_return_fd(void);
|
||||
/* Set event handler invoked by keyboard_update(). */
|
||||
typedef void (*__keyboard_handler) (int scancode, int press);
|
||||
void keyboard_seteventhandler(__keyboard_handler handler);
|
||||
/* Return keyboard to normal state. */
|
||||
void keyboard_close(void);
|
||||
/* Read raw keyboard device and handle events. Returns 0 if no event. */
|
||||
int keyboard_update(void);
|
||||
/* Similar to keyboard_update, but wait for an event to happen. */
|
||||
/* [This doesn't seem to work very well -- use select on fd] */
|
||||
void keyboard_waitforupdate(void);
|
||||
|
||||
/* keyboard_init sets default event handler that keeps track of complete */
|
||||
/* keyboard state: */
|
||||
|
||||
/* Result of keypressed. */
|
||||
#define KEY_NOTPRESSED 0
|
||||
#define KEY_PRESSED 1
|
||||
|
||||
/* Modes for translatekeys. */
|
||||
#define TRANSLATE_CURSORKEYS 1 /* Map cursor block to keypad cursor. */
|
||||
#define TRANSLATE_DIAGONAL 2 /* Map keypad diagonal to keypad cursor. */
|
||||
#define TRANSLATE_KEYPADENTER 4 /* Map keypad enter to main enter key. */
|
||||
#define DONT_CATCH_CTRLC 8 /* Disable Crtl-C check. */
|
||||
|
||||
/* Revert to default handler. */
|
||||
void keyboard_setdefaulteventhandler(void);
|
||||
/* Return pointer to buffer holding state of each key (scancode). */
|
||||
/* Value 1 corresponds to key that is pressed, 0 means not pressed. */
|
||||
char *keyboard_getstate(void);
|
||||
/* Force keyboard state to nothing pressed (all zeroes). */
|
||||
void keyboard_clearstate(void);
|
||||
/* Let default handler translate cursor key block events to numeric keypad */
|
||||
/* cursor key events and other translations. */
|
||||
void keyboard_translatekeys(int mask);
|
||||
|
||||
/* Return nonzero if key is depressed. */
|
||||
int keyboard_keypressed(int scancode);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
Loading…
Reference in New Issue