📄 svgalib.c
字号:
/* svgalib.c * (c) 2000-2002 Karel 'Clock' Kulhavy * This file is a part of the Links program, released under GPL. * * This does graphics driver of svgalib, svgalib mouse. * This doesn't do svgalib keyboard. */#include "cfg.h"/*:%s/->left/->clip.x1/g:%s/->right/->clip.x2/g:%s/->top/->clip.y1/g:%s/->bottom/->clip.y2/g*/#ifdef GRDRV_SVGALIB#include "links.h"#include "bits.h"#ifdef TEXT#undef TEXT#endif#include <vga.h>#include <vgamouse.h>#include "arrow.inc"extern struct itrm *ditrm;extern struct graphics_driver svga_driver;static int mouse_x, mouse_y, mouse_buttons; /* For tracking the state of the mouse */static int background_x, background_y; /* Where was the mouse background taken from */static unsigned char *mouse_buffer, *background_buffer, *new_background_buffer;static struct graphics_device *mouse_graphics_device;static int global_mouse_hidden;static long mouse_black, mouse_white; /* Mouse arrow pointer colors */static int (* mouse_getscansegment)(unsigned char *, int, int, int);static int (* mouse_drawscansegment)(unsigned char *, int, int, int);static int mouse_works = 0;static unsigned char *svga_driver_param; /* NULL by default */static int vga_mode; /* The mode that has been selected */static struct graphics_device *backup_virtual_device;static int mouse_aggregate_flag, mouse_aggregate_action;static int flags = 0; /* OR-ed 1: running in background * 2: vga_block()-ed */#ifndef __SPAD__static int svgalib_timer_id;#endif/*---------------------------LIMITATIONS---------------------------------------*//* pixel_set_paged works only for <=8 bytes per pixel. * Doesn't work on video cards which have 1 pixel spanning more that 65536 bytes! ( :-) ) * vga_linewidth%vga_bytes must be zero. * The bitmaps have all consecutive data. No vidram mallocing is performed. *//*------------------------STRUCTURES-------------------------------------------*/struct modeline{ unsigned char *name; int number;};/*-------------- GLOBAL VARIABLES --------------------------------------------*/#define NUMBER_OF_DEVICES 10#define TEST_INACTIVITY if (dev!=current_virtual_device) return;#define TEST_INACTIVITY_0 if (dev!=current_virtual_device) return 0;#define RECTANGLES_INTERSECT(xl0, xh0, xl1, xh1, yl0, yh0, yl1, yh1) (\ (xl0)<(xh1)\ && (xl1)<(xh0)\ && (yl0)<(yh1)\ && (yl1)<(yh0))#define TEST_MOUSE(xl,xh,yl,yh) if (RECTANGLES_INTERSECT(\ (xl),(xh),\ background_x,background_x+arrow_width,\ (yl),(yh),\ background_y,background_y+arrow_height)\ && !global_mouse_hidden){\ mouse_hidden=1;\ hide_mouse();\ }else mouse_hidden=0;#define END_MOUSE if (mouse_hidden) show_mouse();/* Actual vga mode definition */int vga_linewidth; /* Prepared out from vga_getmodeinfo */int xsize, ysize; /* Prepared out from vga_getmodeinfo */int vga_bytes; /* Prepared out from vga_getmodeinfo */int vga_colors; /* Prepared out from vga_getmodeinfo */int vga_misordered; /* Prepared out from vga_getmodeinfo */int vga_linear; /* 1 linear mode, 0 nonlinear mode (paged) */int palette_depth; /* 6 for normal VGA, 8 for VGA which supports 8 bit DAC */int accel_avail; /* Which accel fns are available */int do_sync; /* Tells the "normal" memory operations (those * that do not use accelerator) to do * vga_accel(ACCEL_SYNC) before writing into the * memory. */int vga_page=-1;int mode_x; /* 1 if mode_X organization is set up */int bmpixelsize; /* Number of bytes per pixel in bitmap */unsigned char *my_graph_mem;unsigned char *scroll_buffer = NULL; /* For paged scrolling only */struct modeline modes[]={#ifdef G320x200x16 {"320x200x16", G320x200x16 },#endif#ifdef G320x200x256 {"320x200x256", G320x200x256 },#endif#ifdef G320x200x32K {"320x200x32K", G320x200x32K },#endif#ifdef G320x200x64K {"320x200x64K", G320x200x64K },#endif#ifdef G320x200x16M {"320x200x16M", G320x200x16M },#endif#ifdef G320x200x16M32 {"320x200x16M32", G320x200x16M32 },#endif#ifdef G320x240x256 {"320x240x256", G320x240x256 },#endif#ifdef G320x240x32K {"320x240x32K", G320x240x32K },#endif#ifdef G320x240x64K {"320x240x64K", G320x240x64K },#endif#ifdef G320x240x16M {"320x240x16M", G320x240x16M },#endif#ifdef G320x240x16M32 {"320x240x16M32", G320x240x16M32 },#endif#ifdef G320x400x256 {"320x400x256", G320x400x256 },#endif#ifdef G320x400x32K {"320x400x32K", G320x400x32K },#endif#ifdef G320x400x64K {"320x400x64K", G320x400x64K },#endif#ifdef G320x400x16M {"320x400x16M", G320x400x16M },#endif#ifdef G320x400x16M32 {"320x400x16M32", G320x400x16M32 },#endif#ifdef G320x480x256 {"320x480x256", G320x480x256 },#endif#ifdef G320x480x32K {"320x480x32K", G320x480x32K },#endif#ifdef G320x480x64K {"320x480x64K", G320x480x64K },#endif#ifdef G320x480x16M {"320x480x16M", G320x480x16M },#endif#ifdef G320x480x16M32 {"320x480x16M32", G320x480x16M32 },#endif#ifdef G360x480x256 {"360x480x256", G360x480x256 },#endif#ifdef G400x300x256 {"400x300x256", G400x300x256 },#endif#ifdef G400x300x32K {"400x300x32K", G400x300x32K },#endif#ifdef G400x300x64K {"400x300x64K", G400x300x64K },#endif#ifdef G400x300x16M {"400x300x16M", G400x300x16M },#endif#ifdef G400x300x16M32 {"400x300x16M32", G400x300x16M32 },#endif#ifdef G400x600x256 {"400x600x256", G400x600x256 },#endif#ifdef G400x600x32K {"400x600x32K", G400x600x32K },#endif#ifdef G400x600x64K {"400x600x64K", G400x600x64K },#endif#ifdef G400x600x16M {"400x600x16M", G400x600x16M },#endif#ifdef G400x600x16M32 {"400x600x16M32", G400x600x16M32 },#endif#ifdef G512x384x256 {"512x384x256", G512x384x256 },#endif#ifdef G512x384x32K {"512x384x32K", G512x384x32K },#endif#ifdef G512x384x64K {"512x384x64K", G512x384x64K },#endif#ifdef G512x384x16M {"512x384x16M", G512x384x16M },#endif#ifdef G512x384x16M32 {"512x384x16M32", G512x384x16M32 },#endif#ifdef G512x480x256 {"512x480x256", G512x480x256 },#endif#ifdef G512x480x32K {"512x480x32K", G512x480x32K },#endif#ifdef G512x480x64K {"512x480x64K", G512x480x64K },#endif#ifdef G512x480x16M {"512x480x16M", G512x480x16M },#endif#ifdef G512x480x16M32 {"512x480x16M32", G512x480x16M32 },#endif#ifdef G640x200x16 {"640x200x16", G640x200x16 },#endif#ifdef G640x350x16 {"640x350x16", G640x350x16 },#endif#ifdef G640x400x256 {"640x400x256", G640x400x256 },#endif#ifdef G640x400x32K {"640x400x32K", G640x400x32K },#endif#ifdef G640x400x64K {"640x400x64K", G640x400x64K },#endif#ifdef G640x400x16M {"640x400x16M", G640x400x16M },#endif#ifdef G640x400x16M32 {"640x400x16M32", G640x400x16M32 },#endif#ifdef G640x480x16 {"640x480x16", G640x480x16 },#endif#ifdef G640x480x256 {"640x480x256", G640x480x256 },#endif#ifdef G640x480x32K {"640x480x32K", G640x480x32K },#endif#ifdef G640x480x64K {"640x480x64K", G640x480x64K },#endif#ifdef G640x480x16M {"640x480x16M", G640x480x16M },#endif#ifdef G640x480x16M32 {"640x480x16M32", G640x480x16M32 },#endif#ifdef G720x540x256 {"720x540x256", G720x540x256 },#endif#ifdef G720x540x32K {"720x540x32K", G720x540x32K },#endif#ifdef G720x540x64K {"720x540x64K", G720x540x64K },#endif#ifdef G720x540x16M {"720x540x16M", G720x540x16M },#endif#ifdef G720x540x16M32 {"720x540x16M32", G720x540x16M32 },#endif#ifdef G800x600x16 {"800x600x16", G800x600x16 },#endif#ifdef G800x600x256 {"800x600x256", G800x600x256 },#endif#ifdef G800x600x32K {"800x600x32K", G800x600x32K },#endif#ifdef G800x600x64K {"800x600x64K", G800x600x64K },#endif#ifdef G800x600x16M {"800x600x16M", G800x600x16M },#endif#ifdef G800x600x16M32 {"800x600x16M32", G800x600x16M32 },#endif#ifdef G848x480x256 {"848x480x256", G848x480x256 },#endif#ifdef G848x480x32K {"848x480x32K", G848x480x32K },#endif#ifdef G848x480x64K {"848x480x64K", G848x480x64K },#endif#ifdef G848x480x16M {"848x480x16M", G848x480x16M },#endif#ifdef G848x480x16M32 {"848x480x16M32", G848x480x16M32 },#endif#ifdef G960x720x256 {"960x720x256", G960x720x256 },#endif#ifdef G960x720x32K {"960x720x32K", G960x720x32K },#endif#ifdef G960x720x64K {"960x720x64K", G960x720x64K },#endif#ifdef G960x720x16M {"960x720x16M", G960x720x16M },#endif#ifdef G960x720x16M32 {"960x720x16M32", G960x720x16M32 },#endif#ifdef G1024x768x16 {"1024x768x16", G1024x768x16 },#endif#ifdef G1024x768x256 {"1024x768x256", G1024x768x256 },#endif#ifdef G1024x768x32K {"1024x768x32K", G1024x768x32K },#endif#ifdef G1024x768x64K {"1024x768x64K", G1024x768x64K },#endif#ifdef G1024x768x16M {"1024x768x16M", G1024x768x16M },#endif#ifdef G1024x768x16M32 {"1024x768x16M32", G1024x768x16M32 },#endif#ifdef G1072x600x256 {"1072x600x256", G1072x600x256 },#endif#ifdef G1072x600x32K {"1072x600x32K", G1072x600x32K },#endif#ifdef G1072x600x64K {"1072x600x64K", G1072x600x64K },#endif#ifdef G1072x600x16M {"1072x600x16M", G1072x600x16M },#endif#ifdef G1072x600x16M32 {"1072x600x16M32", G1072x600x16M32 },#endif#ifdef G1152x864x16 {"1152x864x16", G1152x864x16 },#endif#ifdef G1152x864x256 {"1152x864x256", G1152x864x256 },#endif#ifdef G1152x864x32K {"1152x864x32K", G1152x864x32K },#endif#ifdef G1152x864x64K {"1152x864x64K", G1152x864x64K },#endif#ifdef G1152x864x16M {"1152x864x16M", G1152x864x16M },#endif#ifdef G1152x864x16M32 {"1152x864x16M32", G1152x864x16M32 },#endif#ifdef G1280x720x256 {"1280x720x256", G1280x720x256 },#endif#ifdef G1280x720x32K {"1280x720x32K", G1280x720x32K },#endif#ifdef G1280x720x64K {"1280x720x64K", G1280x720x64K },#endif#ifdef G1280x720x16M {"1280x720x16M", G1280x720x16M },#endif#ifdef G1280x720x16M32 {"1280x720x16M32", G1280x720x16M32 },#endif#ifdef G1280x1024x16 {"1280x1024x16", G1280x1024x16 },#endif#ifdef G1280x1024x256 {"1280x1024x256", G1280x1024x256 },#endif#ifdef G1280x1024x32K {"1280x1024x32K", G1280x1024x32K },#endif#ifdef G1280x1024x64K {"1280x1024x64K", G1280x1024x64K },#endif#ifdef G1280x1024x16M {"1280x1024x16M", G1280x1024x16M },#endif#ifdef G1280x1024x16M32 {"1280x1024x16M32", G1280x1024x16M32 },#endif#ifdef G1360x768x256 {"1360x768x256", G1360x768x256 },#endif#ifdef G1360x768x32K {"1360x768x32K", G1360x768x32K },#endif#ifdef G1360x768x64K {"1360x768x64K", G1360x768x64K },#endif#ifdef G1360x768x16M {"1360x768x16M", G1360x768x16M },#endif#ifdef G1360x768x16M32 {"1360x768x16M32", G1360x768x16M32 },#endif#ifdef G1600x1200x16 {"1600x1200x16", G1600x1200x16 },#endif#ifdef G1600x1200x256 {"1600x1200x256", G1600x1200x256 },#endif#ifdef G1600x1200x32K {"1600x1200x32K", G1600x1200x32K },#endif#ifdef G1600x1200x64K {"1600x1200x64K", G1600x1200x64K },#endif#ifdef G1600x1200x16M {"1600x1200x16M", G1600x1200x16M },#endif#ifdef G1600x1200x16M32 {"1600x1200x16M32", G1600x1200x16M32 },#endif#ifdef G1800x1012x256 {"1800x1012x256", G1800x1012x256 },#endif#ifdef G1800x1012x32K {"1800x1012x32K", G1800x1012x32K },#endif#ifdef G1800x1012x64K {"1800x1012x64K", G1800x1012x64K },#endif#ifdef G1800x1012x16M {"1800x1012x16M", G1800x1012x16M },#endif#ifdef G1800x1012x16M32 {"1800x1012x16M32", G1800x1012x16M32 },#endif#ifdef G1920x1080x256 {"1920x1080x256", G1920x1080x256 },#endif#ifdef G1920x1080x32K {"1920x1080x32K", G1920x1080x32K },#endif#ifdef G1920x1080x64K {"1920x1080x64K", G1920x1080x64K },#endif#ifdef G1920x1080x16M {"1920x1080x16M", G1920x1080x16M },#endif#ifdef G1920x1080x16M32 {"1920x1080x16M32", G1920x1080x16M32 },#endif#ifdef G1920x1440x256 {"1920x1440x256", G1920x1440x256 },#endif#ifdef G1920x1440x32K {"1920x1440x32K", G1920x1440x32K },#endif#ifdef G1920x1440x64K {"1920x1440x64K", G1920x1440x64K },
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -