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

📄 ndraw.h

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


/*指定剪切输出域(包括边线)*/
char screen(int left, int top, int right, int bottom)
{
   if(left>g_screen_h||top>g_screen_v||right<0||bottom<0||right<=left||bottom<=top)
      {return -1;}
   #ifndef NEO_rect_unused
   if (left < 0)
      {left = 0;}
   if (top < 0)
      {top = 0;}
   if (right >= g_screen_h)
      {right =  g_screen_h-1;}
   if (bottom >=g_screen_v)
      {bottom = g_screen_v-1;}

   g_rect_left  = left;
   g_rect_right = right;
   g_rect_top   = top;
   g_rect_bottom= bottom;
   #else
   g_rect_left  = left = g_rect_top   = top  = 0;
   g_rect_right = right= g_screen_h - 1;
   g_rect_bottom= bottom=g_screen_v - 1;
   #endif
   return 0;
}

#ifndef NEO_rect_unused
void rect_store(void)
{
   g_temp_top = g_rect_top;
   g_temp_left= g_rect_left;
   g_temp_right = g_rect_right;
   g_temp_bottom= g_rect_bottom;
}

void rect_restore(void)
{
   g_rect_top = g_temp_top;
   g_rect_left= g_temp_left;
   g_rect_right = g_temp_right;
   g_rect_bottom= g_temp_bottom;
}
#endif


/*显存换页函数*/
void set_vbe_page(int page)
{
   union REGS r;
   if (g_cur_vbe_page != page)
   {
      r.x.ax=0x4f05;
      r.h.bh = 0; /* Set memory window */
      r.h.bl = 0; /* Window A */
      r.x.dx = g_cur_vbe_page = page;
      int86(0x10, &r, &r);
   }
}
/*下面这个函数功能与上面一样,但效率似乎更高些*/
/*void set_vbe_page(int page)
{
   if (g_cur_vbe_page != page)
   {
      _BX=0;
      _DX=g_cur_vbe_page = page;
      g_win_func();
   }
}*/


/*void set_logic_scanl_len(unsigned length)
{
   union REGS r;
   r.x.ax=0x4F06;*/
   /* BL = 00h Set Scan Line Length in Pixels
         = 01h Get Scan Line Length
         = 02h Set Scan Line Length in Bytes
         = 03h Get Maximum Scan Line Length */
   /*r.h.bl = 0;
   r.x.cx = length;
   int86(0x10, &r, &r);
}*/


#ifndef NEO_surface_unused
char surface_alloc(unsigned sur_num, int clear_flag)
{ 
   g_alloc_surface = (sur_num <= g_total_surfaces? sur_num : g_total_surfaces);

   if (clear_flag)
   {
      int i;
      #ifndef NEO_rect_unused
      rect_store();
      #endif
      screen(0, 0, g_screen_h - 1, g_screen_v - 1);
      for (i = 1; i <= g_alloc_surface; ++i)
      {
         set_work_surface(i);
         #ifndef NEO_basic_draw_unused
         rectfill(0, 0, g_rect_right, g_rect_bottom, _BLACK);
         #endif
      }
      #ifndef NEO_rect_unused
      rect_restore();
      #endif
      set_work_surface(0);
   }
   return g_alloc_surface;
}


char set_work_surface(unsigned sur_num)
{
   if (sur_num <= g_alloc_surface && sur_num > 0)
   {
      g_sl_offset = g_screen_v * ((g_work_surface = sur_num) - 1) + (g_screen_v * g_reserved_page)/*跳过系统保留页*/;
   }
   else
   {
      g_work_surface = g_sl_offset = 0;
   }
   return g_work_surface;
}

       
char flip_surface(unsigned sur_num)
{                                                                                           /*跳过系统保留页*/
   unsigned temp = (sur_num <= g_alloc_surface && sur_num > 0)?g_screen_v * (sur_num - 1) + (g_screen_v * g_reserved_page) : 0;


   set_display_start(0, temp);
   g_look_surface = (sur_num <= g_alloc_surface?sur_num : 0);

   return g_look_surface;
}


void flip(void)
{
   static unsigned last = 0;                 /*跳过系统保留页*/

   set_display_start(0, last = (last == 0?g_screen_v * g_reserved_page : 0));
   g_look_surface = last != 0?1 : 0;
}
#endif


#ifndef NEO_draw_mode_unused
void set_draw_mode(int draw_mode)
{
   if ((draw_mode>=COPY_PUT)&&(draw_mode<=NOT_PUT)) g_draw_mode=draw_mode;
}
#endif


/*---------------------------------------------------*
 *函数功能: 将硬件调色板转换为本SDK推荐的逻辑调色板. *
 *参数说明: 无.                                      *
 *返回说明: 无.                                    *
 *备    注: 本SDK推荐的调色板是由经典游戏"仙剑奇侠传"*
 *          的调色板经过分类排序等修改而来的,选色专业*
 *          ,颜色齐,覆盖性好;一般匹配其他图片可以达到*
 *          90%以上的近似效果.所以本SDK将其定为推荐调*
 *          色盘.用户程序可直接调用.                *
 *---------------------------------------------------*/
void set_neo_color(void)
{
#ifndef NEO_sys_pal_unused
   unsigned char rgb[256][3] = {
0,0,0,6,6,6,10,10,10,14,14,14,18,18,18,22,22,22,26,26,26,30,30,30,34,34,34,38,38,38,42,42,42,
46,46,46,50,50,50,54,54,54,59,59,59,63,63,63,20,0,0,23,0,0,28,0,0,33,1,1,38,2,2,47,4,3,54,6,
5,63,0,0,63,0,0,63,14,11,63,18,15,63,22,19,63,22,18,63,32,28,63,37,33,63,43,39,18,5,2,21,6,3,
24,6,3,27,6,3,31,10,4,36,15,7,40,20,9,44,25,11,48,30,15,53,36,18,56,41,21,60,46,24,63,50,28,
63,55,33,63,60,39,63,62,44,12,6,0,22,15,0,32,25,0,41,34,1,48,43,1,57,50,1,59,56,1,62,62,1,62,
62,21,63,63,0,63,63,10,63,63,19,63,63,28,63,63,41,63,63,49,63,63,60,5,3,2,7,5,3,10,7,5,13,10,
7,16,13,9,18,16,11,21,19,14,24,22,16,27,25,19,29,28,21,32,31,24,35,34,28,38,37,31,41,40,36,
45,44,40,49,46,43,0,0,15,0,0,19,1,1,27,2,2,32,3,3,37,2,2,41,3,3,46,0,3,51,0,0,58,0,0,63,7,7,
63,14,14,63,21,21,63,28,28,63,38,38,63,42,42,63,7,4,14,9,5,17,11,6,20,13,8,23,15,10,26,18,12,
29,21,14,32,24,17,35,27,20,38,31,23,41,34,27,44,38,31,47,42,35,50,46,40,53,50,44,56,54,49,59,
5,9,10,7,11,13,9,14,16,11,17,19,13,20,22,16,23,25,19,26,28,22,30,32,26,33,35,30,37,39,33,40,
42,38,44,46,42,48,50,47,52,53,52,56,57,57,60,61,0,4,2,0,8,5,0,11,8,1,15,11,2,19,15,4,23,19,6,
26,22,8,30,26,11,34,29,13,38,33,17,42,37,21,46,41,26,50,45,31,54,49,36,58,52,42,62,57,23,10,
6,28,14,8,33,18,10,36,23,13,40,28,16,43,32,19,45,33,21,47,33,24,49,33,27,50,36,30,52,39,33,
54,42,37,55,45,40,57,48,43,58,51,47,60,54,50,12,4,0,16,6,0,21,8,1,24,10,2,27,12,3,30,15,6,33,
18,8,36,21,11,39,25,14,42,29,17,45,33,21,48,37,25,51,41,30,55,46,35,59,50,41,63,56,48,9,3,1,
12,5,2,15,7,3,18,9,4,22,13,7,25,16,9,28,19,12,32,23,15,35,28,18,39,32,22,42,36,27,46,41,31,
49,45,36,53,50,42,57,55,48,61,60,55,0,7,0,0,9,0,1,12,0,2,15,1,4,19,2,6,24,3,8,31,5,11,39,7,
14,45,9,0,49,0,6,49,0,11,49,0,19,49,19,26,49,22,32,49,26,28,49,31,0,6,23,0,8,27,1,10,31,3,12,
35,5,15,40,7,17,44,10,20,48,13,23,50,17,27,52,21,31,55,25,35,56,30,39,58,35,43,59,39,47,60,
44,51,61,50,55,63,9,5,3,12,7,4,15,10,6,18,13,8,22,17,11,25,20,13,28,23,16,31,27,19,34,30,22,
37,34,26,40,37,30,44,41,34,47,45,38,50,49,42,53,52,46,56,55,50, 0,0,0,32,0,0,0,32,0,32,32,
0,0,0,32,32,0,32,0,32,32,32,32,32,48,48,48,63,0,0,0,63,0,63,63,0,0,0,63,63,0,63,0,63,
63,63,63,63
};
   set_palette(*rgb);
#endif
}
#define set_neo_palette() set_neo_color()


void set_palette_range(char *pal_buf, int from, int to, int vsync_flag)
{
#ifndef MSVC15
   struct REGPACK reg;
#else
   int _cx,_es,_dx;
#endif
   if (from <= to && from >= 0 && from < 256 && to - from < 256)
   {
      if (vsync_flag)
         vsync();
#ifndef MSVC15
      reg.r_ax = 0x1012;
      reg.r_bx = from;
      reg.r_cx = to - from + 1;
      reg.r_es = FP_SEG(pal_buf);
      reg.r_dx = FP_OFF(pal_buf);
      intr(0x10,&reg);
#else
	  _asm
	   {
	   mov ax,1012h
	   mov bx,from
	   }
	   _cx=to-from+1;
	   _es= FP_SEG(pal_buf);
       _dx = FP_OFF(pal_buf);
	   _asm
	    {
		int 10h
		}
#endif
   }
}


void _set_palette_range(PALETTE pal_buf, int from, int to, int vsync_flag)
{
   set_palette_range((char *)pal_buf, from, to, vsync_flag);
}


void get_palette_range(char *pal_buf, int from, int to)
{
#ifndef MSVC15
   struct REGPACK reg;
#else
   int _cx,_es,_dx;
#endif
   if (from <= to && from >= 0 && from < 256 && to - from < 256)
   {
#ifndef MSVC15
      reg.r_ax = 0x1017;
      reg.r_bx = from;
      reg.r_cx = to - from + 1;
      reg.r_es = FP_SEG(pal_buf);
      reg.r_dx = FP_OFF(pal_buf);
      intr(0x10,&reg);
#else
	  _asm
	   {
	   mov ax,1017h
	   mov bx,from
	   }
	   _cx=to-from+1;
	   _es= FP_SEG(pal_buf);
       _dx = FP_OFF(pal_buf);
	   _asm
	    {
		int 10h
		}
#endif
   }
}

void _get_palette_range(PALETTE pal_buf, int from, int to)
{
   get_palette_range((char *)pal_buf, from, to);
}


/*---------------------------------------------------*
 *函数功能: 设置硬件调色板中指定颜色号的颜色分量.    *
 *参数说明: index为颜色号.                           *
 *          red,green,blue为此颜色号对应的红,绿,兰三 *
 *          原色分量,均应小于64)                     *
 *返回说明: 成功返回1;否则返回0.                     *
 *备    注: 颜色设置函数.用户程序可直接调用.        *
 *---------------------------------------------------*/
char set_color(int index, char red,char green, char blue)
{
   unsigned char color[3];

   color[0] = red;
   color[1] = green;
   color[2] = blue;
   set_palette_range(color, index, index, 0);
   return -1;
}


#ifndef NEO_palette_unused
/*---------------------------------------------------*
 *函数功能: 设置硬件调色板为逻辑调色板.              *
 *参数说明: pal_buf指向存放256种颜色分量数组的指针.  *
 *这个数组的形式一般可以有两种:pal[256][3]和pal[768]*
 *返回说明: 无.                                      *
 *备    注: 颜色设置函数.用户程序可直接调用.        *
 *---------------------------------------------------*/
void set_palette(char *pal_buf)
{
   #ifndef NEO_draw_smooth_unused
   set_palette_range(pal_buf, 0, 255, 1);
   #else
   set_palette_range(pal_buf, 0, 255, 0);
   #endif
}

void _set_palette(PALETTE pal_buf)
{
   #ifndef NEO_draw_smooth_unused
   _set_palette_range(pal_buf, 0, 255, 1);
   #else
   _set_palette_range(pal_buf, 0, 255, 0);
   #endif
}


void get_palette(char *pal_buf)/*获取系统调色板*/
{
   get_palette_range(pal_buf, 0, 255);
}

void _get_palette(PALETTE pal_buf)
{
   _get_palette_range(pal_buf, 0, 255);
}


unsigned char get_red(int index)
{
   unsigned char color[3];

   get_palette_range(color, index, index);
   return color[0];
}

unsigned char get_green(int index)
{
   unsigned char color[3];

   get_palette_range(color, index, index);
   return color[1];
}

unsigned char get_blue(int index)
{
   unsigned char color[3];

   get_palette_range(color, index, index);
   return color[2];
}


void set_dac_size(unsigned char size)
{
#ifndef MSVC15
   _AX = 0x4f08;
   _BL = 0;
   _BH = size;
   __int__(0x10);
#else
	char sz=(char)size;
	_asm
	{
	mov ax,4f08h
    mov bl,0h
    mov bh,sz
    int 10h
	}
#endif
   g_dac_size_fix = ((size == 6) || (size == 8)) ? 8 - size : 2;
}

char get_dac_size(void)
{
#ifndef MSVC15
   _AX = 0x4f08;
   _BL = 1;
   __int__(0x10);
   return 8 - (g_dac_size_fix = 8 - _BH);
#else
   char _bh;
   _asm
	{
	mov ax,4f08h
	mov bl,1
    int 10h
    mov _bh,bh
	}
   return 8 - (g_dac_size_fix = 8 - _bh);
#endif
}


#ifndef NEO_color_depth_8_unused
#ifndef NEO_fade_pal_unused
void fade_interpolate(PALETTE source, PALETTE dest, PALETTE output, int pos, int from, int to)
{
   int c;

   for (c=from; c<=to; c++) { 
      output[c].r = ((int)source[c].r * (63-pos) + (int)dest[c].r * pos) >> 6;
      output[c].g = ((int)source[c].g * (63-pos) + (int)dest[c].g * pos) >> 6;
      output[c].b = ((int)source[c].b * (63-pos) + (int)dest[c].b * pos) >> 6;
   }
}

void fade_from_range(PALETTE source, PALETTE dest, int speed, int from, int to)
{
   PALETTE temp;
   int c, start, last;

   for (c=0; c<_PAL_SIZE; c++)
      temp[c] = source[c];


      speed = speed <= 0?1 : speed;
      for (c=0; c < 64; c += speed)
      {
         fade_interpolate(source, dest, temp, c, from, to);
         _set_palette_range(temp, from, to, TRUE);
         if (fade_callback) (*fade_callback)();
      }

   _set_palette_range(dest, from, to, TRUE);
}


void fade_in_range(PALETTE p, int speed, int from, int to)
{
   fade_from_range(g_black_palette, p, speed, from, to);
}

void fade_out_range(int speed, int from, int to)
{
   PALETTE temp;

   _get_palette(temp);
   fade_from_range(temp, g_black_palette, speed, from, to);
}

void _fade_in(PALETTE p, int speed)
{
   fade_in_range(p, speed, 0, _PAL_SIZE-1);
}

void _fade_out(int speed)
{
   fade_out_range(speed, 0, _PAL_SIZE-1);
}


void fade_in(PALETTE p, unsigned char dest_color, int speed)
{
   unsigned int i;
   RGB24  black_rbg = {0,0,0};
   RGB24  temp_rbg;
   temp_rbg.r = get_red(dest_color);
   temp_rbg.g = get_green(dest_color);
   temp_rbg.b = get_blue(dest_color);

   for (i=0; i<256; i++)
      g_black_palette[i] = temp_rbg;
   _fade_in(p, speed);
   for (i=0; i<256; i++)
      g_black_palette[i] = black_rbg;
}

void fade_out(unsigned char dest_color, int speed)
{
   unsigned int i;
   RGB24  black_rbg = {0,0,0};
   RGB24  temp_rbg;
   temp_rbg.r = get_red(dest_color);
   temp_rbg.g = get_green(dest_color);
   temp_rbg.b = get_blue(dest_color);

   for (i=0; i<256; i++)
      g_black_palette[i] = temp_rbg;
   _fade_out(speed);
   for (i=0; i<256; i++)
      g_black_palette[i] = black_rbg;
}
#endif
#endif

#endif



void vsync(void)
{
   while  ( inportb(0x3da)&0x08 ) ;
   while (!(inportb(0x3da)&0x08)) ;
}


#endif

⌨️ 快捷键说明

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