📄 video.c
字号:
#define VGA256 0x13
#define TEXT_MODE 0x03
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 200
unsigned char far *video_buffer = (char far *) 0xA0000000L;
typedef struct video_image_typ{
int width, height;
char far *buffer;
}
video_image, *video_image_ptr;
void Set_Video_Mode(int mode){
union REGS inregs,outregs;
inregs.h.ah = 0;
inregs.h.al = (unsigned char)mode;
int86(0x10, &inregs, &outregs);
}
void Plot_Pixel_Fast(int x, int y, char color){
video_buffer[((y<<8)+(y<<6))+x] = color;
}
void VLine(int y1, int y2, int x, unsigned char color){
unsigned int LineOffset, index;
LineOffset = ((y1<<8)+(y1<<6))+x;
for (index = 0; index <= y2-y1; index++){
video_buffer[LineOffset] = color;
LineOffset += 320;
}
}
void HLine(int x1, int x2, int y, unsigned char color){
_fmemset(&video_buffer[((y << 8) + (y << 6)) + x1], color, x2 - x1 + 1);
}
void BLine(int x0, int y0, int x1, int y1, unsigned char color){
int dx, dy, x_inc, y_inc, error=0, index;
unsigned char far *vb_start=video_buffer;
vb_start = vb_start+((unsigned)y0<<6) + ((unsigned)y0<<8)+(unsigned)x0;
dx = x1-x0;
dy = y1-y0;
if (dx>=0) x_inc=1;
else {x_inc = -1; dx = -dx;}
if (dy>=0) y_inc = 320;
else {y_inc=-320; dy = -dy;}
if (dx > dy)
for (index=0; index<=dx; index++){
*vb_start = color;
error+=dy;
if (error>dx){
error-=dx;
vb_start+=y_inc;
}
vb_start+=x_inc;
}
else{
for (index=0; index<=dy; index++){
*vb_start = color;
error += dx;
if (error>0){
error-=dy;
vb_start+=x_inc;
}
vb_start += y_inc;
}
}
}
void GetImage(int x0, int y0, int x1, int y1, video_image_ptr image){
unsigned size;
int i;
if (y1 >= SCREEN_HEIGHT) y1 = SCREEN_HEIGHT - 1;
if (x1 >= SCREEN_WIDTH) x1 = SCREEN_WIDTH - 1;
size = (y1 - y0) * (x1 - x0);
image->width = x1 - x0;
image->height = y1 - y0;
if ((image->buffer = (char far *)farmalloc(size)) == NULL){
printf("Low memory for image.buffer!\n");
getch();
exit(1);
}
for (i = y0; i <= y1; i++)
_fmemcpy(&image->buffer[(i - y0) * image->width], &video_buffer[i * SCREEN_WIDTH + x0], image->width);
}
void PutImage(video_image image, int x, int y){
int i;
for (i = 0; i < image.height; i++)
_fmemcpy(&video_buffer[(y + i) * SCREEN_WIDTH + x], &image.buffer[i * image.width], image.width);
}
void clean_black(int x, int y, int dx, int dy){
int i;
for (i = 0; i < dy; i++)
_fmemset(&video_buffer[(i + y) * SCREEN_WIDTH + x], 0, dx);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -