⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ndraw.h

📁 NEO SDK是一个跨平台的免费开源图形软件开发包。它支持基本绘图、多种格式图形显示、鼠标操 作、扩展内存和扩充内存的操作、时钟、音频播放、多种字体的汉字及英文显示等等特性;更激动人心的是
💻 H
📖 第 1 页 / 共 2 页
字号:
/*NEO SDK V2.1.41 For DOS
  Copyleft Cker Home 2003-2005.

  Open Source Obey NEO_PL.TXT.
  http://neo.coderlife.net
  ckerhome@yahoo.com.cn

  文件名称 : ndraw.h
  摘    要 : 本头文件包含了NEO SDK里有关显卡硬件加速及显存、屏幕底层处理的函数、结构、全局
             变量的声明及定义
  当前版本 : 4.24
  作    者 : 董凯
  完成日期 : 2005.6.29

  取代版本 : 4.22
  原 作 者 : 董凯
  完成日期 : 2005.6.19
*/
#ifndef  NDRAW_H
#define  NDRAW_H

#if defined NEO_color_depth_16_unused && defined NEO_color_depth_8_unused
#undef NEO_color_depth_8_unused
#undef NEO_color_depth_16_unused
#endif


#define  VBE320X200X256   0X13
#define  VBE640X400X256   0X100
#define  VBE640X480X256   0X101
#define  VBE800X600X256   0X103
#define  VBE1024X768X256  0X105
#define  VBE1280X1024X256 0X107

#define  VBE320X200X32K   0X10D
#define  VBE640X480X32K   0X110
#define  VBE800X600X32K   0X113
#define  VBE1024X768X32K  0X116
#define  VBE1280X1024X32K 0X119

#define  VBE320X200X64K   0X10E
#define  VBE640X480X64K   0X111
#define  VBE800X600X64K   0X114
#define  VBE1024X768X64K  0X117
#define  VBE1280X1024X64K 0X11A

#define  SCREEN_W      g_screen_h
#define  SCREEN_H      g_screen_v
#define  _UP_ROLL      0
#define  _DOWN_ROLL    1
#define  _LEFT_ROLL    2
#define  _RIGHT_ROLL   3

#define  _WHITE   0xf
#define  _BLACK   0

struct vbe_info_t
{
   char  VESA_signature[4];      /* 'VESA' 4 byte signature */
   short VBE_version;            /* VBE version number */
   char  far *OEM_string_ptr;    /* Pointer to OEM string */
   long  capabilities;           /* Capabilities of video card */
   unsigned far *video_mode_ptr;    /* Pointer to supported modes */
   short total_memory;        /* Number of 64kb memory blocks */
   char  reserved[492];       /* Pad to 492 byte block size */
};

typedef struct CRTCInfoBlock_T
{
   unsigned short horizontal_total;
   unsigned short horizontal_sync_start;
   unsigned short horizontal_sync_end;
   unsigned short vertical_total;
   unsigned short vertical_sync_start;
   unsigned short vertical_sync_end;
   unsigned char  flags;
    char    far  *pixel_clock;
   unsigned short refresh_rate;
   char  reserved[40]; 
}CRTC_T;

typedef struct ModeInfoBlock_T
{
   /* Mandatory information for all VBE revisions */
unsigned short mode_attributes; /* Mode attributes */
unsigned char  win_a_attributes; /* Window A attributes */
unsigned char  win_b_attributes; /* Window B attributes */
unsigned short win_granularity; /* Window granularity in k */
unsigned short win_size; /* Window size in k */
unsigned short win_a_segment; /* Window A segment */
unsigned short win_b_segment; /* Window B segment */
void (far *win_func_ptr)(void); /* Pointer to window function */
unsigned short bytes_per_scan_line; /* Bytes per scanline */

/* Mandatory information for VBE 1.2 and above */
unsigned short x_resolution; /* Horizontal resolution */
unsigned short y_resolution; /* Vertical resolution */
unsigned char  x_char_size; /* Character cell width */
unsigned char  y_char_size; /* Character cell height */
unsigned char  number_of_planes; /* Number of memory planes */
unsigned char  bits_per_pixel; /* Bits per pixel */
unsigned char  number_of_banks; /* Number of CGA style banks */
unsigned char  memory_model; /* Memory model type */
unsigned char  bank_size; /* Size of CGA style banks */
unsigned char  number_of_image_pages; /* Number of images pages */
unsigned char  res1; /* Reserved */
/* Direct Color fields (required for direct/6 and YUV/7 memory models) */
unsigned char  red_mask_size; /* Size of direct color red mask */
unsigned char  red_field_position; /* Bit posn of lsb of red mask */
unsigned char  green_mask_size; /* Size of direct color green mask */
unsigned char  green_field_position; /* Bit posn of lsb of green mask */
unsigned char  blue_mask_size; /* Size of direct color blue mask */
unsigned char  blue_field_position; /* Bit posn of lsb of blue mask */
unsigned char  rsvd_mask_size; /* Size of direct color res mask */
unsigned char  rsvd_field_position; /* Bit posn of lsb of res mask */
unsigned char  direct_color_mode_info; /* Direct color mode attributes */

/* Mandatory information for VBE 2.0 and above*/
void far *phys_base_ptr;
void far *res2;
unsigned short res3;

/* Mandatory information for VBE 3.0 and above*/
unsigned short bytes_per_scanline;
unsigned char  bnk_num_of_imagepages;
unsigned char  lin_num_of_imagepages;
unsigned char  lin_red_mask_size;
unsigned char  lin_red_field_pos;
unsigned char  lin_green_mask_size;
unsigned char  lin_green_field_pos;
unsigned char  lin_blue_mask_size;
unsigned char  lin_blue_field_pos;
unsigned char  lin_rsvd_mask_size;
unsigned char  lin_rsvd_field_pos;
void far *max_pixel_clock;

unsigned char  res4[189]; /* Pad to 256 byte block size */
}mode_info_t;

typedef union
{
   unsigned char c1;
   unsigned char c2;
   unsigned color;
}RGB16;

typedef struct RGB
{
   unsigned char r;
   unsigned char g;
   unsigned char b;
}RGB24, RGB;

typedef struct PIC_RGB
{
   unsigned char blue;
   unsigned char green;
   unsigned char red;
   unsigned char reserved;
}PIC_RGB, *PIC_RGB_ptr;

enum MASK_COLOR
{
   TPT8  = 0X0,
   TPT15 = 0X7C1F,
   TPT16 = 0XF81F,
   /*TPT24 = 0XFF00FFL,
   TPT32 = 0XFF00FFL,*/
};

    
enum DRAWIMAGEOPS
{
   COPY_PUT,
   XOR_PUT,
   OR_PUT,
   AND_PUT,
   NOT_PUT
};

/*===============NEO的私有全局变量(请勿擅自俢改,以免造成不可预料的错误!)================*/
char far *g_videoptr = (char far *)0xa0000000;
char g_page_num    = 0;
char g_green_mask  = 0;
char g_green_bit   = 0;
char g_color_depth = 0;    /*记录当前图形模式的色深,为0表示非图形模式*/
char g_color_byte  = 0;    /*记录当前图形模式每个点占用的字节数*/
int  g_screen_h;           /*当前分辨率下的屏幕宽度*/
int  g_screen_v;           /*当前分辨率下的屏幕高度*/
int  g_clear_vram  = 0;    /*清除显存标志,0表示每次显示模式的改变都同步清除显存原有内容*/
int  g_cur_vbe_page= 0;    /*当前所处的显示页*/
long g_screen_size;        /*记录当前图形模式的屏幕面积*/
/*char g_last_surface = 0;   换页前所在页号*/
char g_work_surface = 0;   /*当前工作页*/
char g_look_surface = 0;   /*当前可视页*/
char g_vbe_version = -1;   /*VBE的主版本号*/
char g_vbe_sub_ver =  0;   /*VBE的副版本号*/
char g_total_surfaces =0;  /*记录能创建的后台页的总量,视显存大小而定*/
char g_alloc_surface = 0;  /*已经申请的后台页数*/
char g_reserved_page = 1;  /*保留页面张数*/
char g_flip_flag = 0;      /*换页状态标志,用来与鼠标例程通讯*/
unsigned g_sl_offset  = 0;
unsigned g_total_vram = 0; /*总显存数*/
unsigned g_blit_fix;       /*NEO目前用于blit()函数的临时变量*/
/*=======================================================================================*/
int  g_frt_color = 1;
int  g_tptcolor  = 0;     /*本开发包指定透明色(Transparent color)*/
char g_draw_mode = 0;     /*绘图模式,分为COPY_PUT,XOR_PUT,OR_PUT,AND_PUT,NOT_PUT,与TC中Graphics的绘图模式意义相同*/
/*以下4个变量用来支持裁剪输出,分别代表裁剪区域的左上角及右下角坐标(用户通过screen()函数间接设置)*/
int  g_rect_left;
int  g_rect_right;
int  g_rect_top;
int  g_rect_bottom;
int  g_temp_top;
int  g_temp_left;
int  g_temp_right;
int  g_temp_bottom;
double  g_time_total  = 0.0;
char g_dac_size_fix = 2;    /*记录DAC调色板宽度修正值,由8-当前DAC宽度得来,默认为2*/

#ifndef _MASK_COLOR
#define _MASK_COLOR   g_tptcolor
#endif

#define retrace_count g_time_total
#define _PAL_SIZE     256
typedef RGB24 PALLETE[_PAL_SIZE];
#define PALETTE       PALLETE

#ifndef NEO_palette_unused
PALETTE g_black_palette;
#endif

/*======================================================*
 *              函数声明(Function declare)              *
 *======================================================*/
char set_vbe_mode(int mode);
int  get_vbe_mode(void);
char get_page_num(void);
void set_display_start(unsigned fir_scan_dot, unsigned fir_scan_line);

char screen(int left, int top, int right, int bottom);
void rect_store(void);
void rect_restore(void);

void set_vbe_page(int page);

extern void rectfill(int x1, int y1, int x2, int y2, int color);
char surface_alloc(unsigned sur_num, int clear_flag);
char set_work_surface(unsigned sur_num);
char flip_surface(unsigned sur_num);
void flip(void);

void set_draw_mode(int draw_mode);

void set_neo_color(void);
void set_palette_range(char *pal_buf, int from, int to, int vsync_flag);
void _set_palette_range(PALETTE pal_buf, int from, int to, int vsync_flag);
void get_palette_range(char *pal_buf, int from, int to);
void _get_palette_range(PALETTE pal_buf, int from, int to);
char set_color(int index, char red,char green, char blue);
void set_dac_size(unsigned char size);
char get_dac_size(void);
void set_palette(char *pal_buf);
void _set_palette(PALETTE pal_buf);
void get_palette(char *pal_buf);
void _get_palette(PALETTE pal_buf);
unsigned char get_red(int index);
unsigned char get_green(int index);
unsigned char get_blue(int index);

void (*fade_callback)() = NULL;
void fade_interpolate(PALETTE source, PALETTE dest, PALETTE output, int pos, int from, int to);
void fade_from_range(PALETTE source, PALETTE dest, int speed, int from, int to);
void fade_in_range(PALETTE p, int speed, int from, int to);
void fade_out_range(int speed, int from, int to);
void _fade_in(PALETTE p, int speed);
void fade_in(PALETTE p, unsigned char dest_color, int speed);
void _fade_out(int speed);
void fade_out(unsigned char dest_color, int speed);
void vsync(void);

extern void show_mouse(void);
extern void hide_mouse(void);
extern void scare_mouse(void);
extern void unscare_mouse(void);

/*======================================================*
 *            函数定义(Function definitions)            *
 *======================================================*/
#define max_x()              g_screen_h
#define max_y()              g_screen_v
#define get_color_depth()    g_color_depth
#define clear_vram_on()      g_clear_vram = 0
#define clear_vram_off()     g_clear_vram = 0x8000
#define get_current_page()   g_cur_vbe_page
#define get_total_vram()     (g_total_vram >> 4)
#define get_total_surfaces() g_total_surfaces
#define surface_realloc(sur_num,flag) surface_alloc(sur_num,flag)
#define makecol16(r,g,b)     ((((((r)>>3)<<g_green_mask)+((g)>>g_green_bit))<<5)+((b)>>3))
#define getr8(c)             get_red(c)
#define getg8(c)             get_green(c)
#define getb8(c)             get_blue(c)
#define getr15(c)            (((c)&0x7c00)>>10)
#define getg15(c)            (((c)&0x3e0) >>5)
#define getb15(c)            ((c)&0x1f)
#define getr16(c)            (((c)&0xf800)>>11)
#define getg16(c)            (((c)&0x7e0) >>5)
#define getb16(c)            ((c)&0x1f)
#define getr24(c)            (((c)&0xff0000)>>16)
#define getg24(c)            (((c)&0xff00)>>8)
#define getb24(c)            (c&0xff)
#define getr32(c)            getr24(c)
#define getg32(c)            getg24(c)
#define getb32(c)            getg24(c)

/*void far (*g_win_func)();*/
/*int g_refresh_rate = 6000;*/
/*設置SVGA的显示模式*/
char set_vbe_mode(int mode)
{
   mode_info_t mode_info;
   CRTC_T crtc_info;
   struct SREGS segs;
   union  REGS r;
   int    real_mode;
   char   far *modeinfo = (char far *)&mode_info;
   char   far *crtcinfo = (char far *)&crtc_info;
   /*char   p_c = 65;*/
   if (g_vbe_version < 0)
   {
      #ifndef NEO_sys_report_error_unused
      Errinfo_t error = {"set_vbe_mode", N_NEO_NOT_INIT, 0};
      throw_error(error);
      #endif     
   }
  /*crtc_info.refresh_rate = g_refresh_rate;
   crtc_info.flags = 3;
   crtc_info.pixel_clock =  &p_c;
   crtc_info.horizontal_total = 1360;crtc_info.vertical_total = 802;*/

   real_mode = (mode & 0x1ff) + g_clear_vram;
   /*线性寻址real_mode |= 0x4000;*/
   /*real_mode |= 0x800;*//*4800*/
   /*切换到指定图形模式*/
   r.x.ax = 0x4f02;
   r.x.bx = real_mode;
   r.x.di = FP_OFF(crtcinfo);
   segs.es = FP_SEG(crtcinfo);
   int86x(0x10, &r, &r, &segs);

   if (mode >= 0x100)
   {
      r.x.ax = 0x4f01;
      r.x.cx = mode;
      r.x.di = FP_OFF(modeinfo);
      segs.es = FP_SEG(modeinfo);
      int86x(0x10, &r, &r, &segs);
      if (r.x.ax != 0x4F) return FALSE; /*显卡不支持VESA标准*/
   }
   else
   {
      if (mode == 0x13)/*该模式不支持硬件换页机制*/
      {
         r.h.ah=0;
         r.h.al=mode;
         int86(0x10,&r,&r);
         g_color_depth = 8;
         g_color_byte  = (char)(g_color_depth / 7);
         g_rect_left   = g_rect_top = 0;
         g_rect_right  = (g_screen_h = 320) - 1;
         g_rect_bottom = (g_screen_v = 200) - 1;
         g_screen_size = g_screen_h * g_screen_v;
         g_tptcolor = TPT8;
         screen(0, 0, g_rect_right, g_rect_bottom);
         return TRUE;
      }
      else
         return FALSE; /* 忽略非VBE模式*/
   }

   #ifndef NEO_bmp_masked_blit_unused
   switch (mode) /*临时使用*/
   {
      case 0x101:
      g_blit_fix = 45056;
      break;
      case 0x103:
      g_blit_fix = 21248;
      break;
      case 0x105:
      g_blit_fix = 65534;
      break;
      default:
      g_blit_fix = 0;
      break;
   }
   #endif
     /* g_win_func = mode_info.win_func_ptr;*/
   g_green_mask  = mode_info.green_mask_size;
   g_color_depth = mode_info.bits_per_pixel;
   g_color_byte  = (char)(g_color_depth / 7);
   g_rect_left   = g_rect_top = 0;
   g_rect_right  = (g_screen_h = mode_info.x_resolution) - 1;
   g_rect_bottom = (g_screen_v = mode_info.y_resolution) - 1;
   g_screen_size = g_screen_h * g_screen_v;
   screen(0, 0, g_rect_right, g_rect_bottom);
   g_total_surfaces = mode_info.number_of_image_pages << 1;
   if (mode == 0x101) g_total_surfaces += 3;
   else if (mode == 0x116 || mode == 0x117) g_total_surfaces = 3; /*处理特殊情况*/
   else if (mode == 0x10e || mode == 0x111 || mode == 0x103) g_total_surfaces += 1;

   switch (g_color_depth)
   {
      case 8:
      g_tptcolor = TPT8;
      break;
      case 15:
      g_tptcolor = TPT15;
      g_green_bit= 3;
      break;
      case 16:
      g_tptcolor = TPT16;
      g_green_bit= 2;
      break;
      /*case 24:
      g_tptcolor = TPT24;
      break;
      case 32:
      g_tptcolor = TPT32;
      break;*/
      default:
      g_tptcolor = TPT8;
      break;
   }
   g_routines |= 1;
   g_page_num = get_page_num();
   return TRUE;
}


/*获得SVGA的显示模式*/
int get_vbe_mode(void)
{
#ifndef MSVC15
   _AX = 0x4f03;
   __int__(0x10); 
   return _BX;
#else
   int _bx;
   _asm
	{
	mov ax,4f03h
	int 10h
	mov _bx,bx
	}
	return _bx;
#endif
}

char get_page_num(void)
{
   char pages[28] = {4, 5, 4, 8, 6, 12, 10, 20, -1, -1, -1, -1, -1, 2, 2, 3, 10, 10, 15,
                     15, 15,  22, 24, 24, 36, 40, 40, 60};
   int tmp;
#ifndef MSVC15
   _AX = 0x4f03;
   __int__(0x10);   
#else
   int _bx;
   _asm
	{
	mov ax,4f03h
	int 10h
	mov _bx,bx
	}
#endif

#ifndef MSVC15
   if ((tmp = _BX) >= 0x100)
#else
   if ((tmp = _bx) >= 0x100)
#endif
   {
      return pages[tmp - 256];
   }
   else if (tmp == 0x13)
   {
      return 1;
   }
   return -1;
}


/*设置扫描线的起点*/
void set_display_start(unsigned fir_scan_dot, unsigned fir_scan_line)
{
#ifndef MSVC15
   _AX = 0x4f07;
   _BH = 0;
   _BL = 0;
   _CX = fir_scan_dot;
   _DX = fir_scan_line;
   __int__(0x10);
#else
	_asm
	{
	mov ax,4f07h
	mov bh,0
	mov bl,0
	mov cx,fir_scan_dot
    mov dx,fir_scan_line
	int 10h
	}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -