开始写svgalib接口

This commit is contained in:
chinky 2017-03-06 08:18:06 +08:00
parent 57e26b8fca
commit 0d85671e6d
33 changed files with 3579 additions and 21 deletions

BIN
fb2/test_arm Executable file

Binary file not shown.

View File

@ -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

BIN
fb5/test_fb5 Executable file

Binary file not shown.

View File

@ -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

BIN
fb6/test

Binary file not shown.

View File

@ -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);

BIN
fb6/test_fb6 Executable file

Binary file not shown.

View File

@ -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

View File

@ -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;

BIN
fb7/test_fb7 Executable file

Binary file not shown.

25
svgalib/Makefile Normal file
View File

@ -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

84
svgalib/README.md Normal file
View File

@ -0,0 +1,84 @@
**(一):写在前面**
这一次没有进行功能上的改进主要是为了后来修改方便而将画点画线画长方形画圆等的提取出来对Makefile进行了修改方便于后期的维护同时为了后面实现我的思路我进行了一个测试就是实现一个运动的圆的效果圆是可以运动了但是效果不是特别好后面再了解一下图形化界面是怎么实现的我再试一下别的思路
**(二):功能介绍**
*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>

17
svgalib/circle.c Normal file
View File

@ -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);
}
}

24
svgalib/circle.h Normal file
View File

@ -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_

61
svgalib/color.h Normal file
View File

@ -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_

206
svgalib/fbtool.c Normal file
View File

@ -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;
}

154
svgalib/fbtool.h Normal file
View File

@ -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

633
svgalib/glline.c Normal file
View File

@ -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;
}
}
}

667
svgalib/grlib.c Normal file
View File

@ -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

53
svgalib/line.c Normal file
View File

@ -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);
}

60
svgalib/line.h Normal file
View File

@ -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_

112
svgalib/page.h Normal file
View File

@ -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 */

103
svgalib/page.h.bak2 Executable file
View File

@ -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 */

95
svgalib/point.c Normal file
View File

@ -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);
}
//画点 color分别代表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;
}

96
svgalib/point.h Normal file
View File

@ -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_

30
svgalib/rectangle.c Normal file
View File

@ -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);
}
}
}

44
svgalib/rectangle.h Normal file
View File

@ -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_

150
svgalib/test.c Normal file
View File

@ -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;
}

BIN
svgalib/test_fb7 Executable file

Binary file not shown.

7
svgalib/vga.c Normal file
View File

@ -0,0 +1,7 @@
#include "vga.h"
int vga_init(void)
{
}

551
svgalib/vga.h Normal file
View File

@ -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 */

188
svgalib/vgagl.h Normal file
View File

@ -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

198
svgalib/vgakeyboard.h Normal file
View File

@ -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