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

📄 n2d.h

📁 NEO SDK是一个跨平台的免费开源图形软件开发包。它支持基本绘图、多种格式图形显示、鼠标操 作、扩展内存和扩充内存的操作、时钟、音频播放、多种字体的汉字及英文显示等等特性;更激动人心的是
💻 H
📖 第 1 页 / 共 2 页
字号:
      {
         return -1;
      }
       if (x >= 0 && x < rect_scr_h)
      {
         if (rect_scr_h - x >= width) /*直线完全显示*/
         {
            len = length = width + 1;
         }
         else                         /*直线右边溢出*/
         {
            /*if (x > g_rect_left)
            {
               x = x - g_rect_left;
            }*/
            len = length = rect_scr_h - x + 1;
         }
      }
      else if (x < 0 && x > (-width))
      {
         if (width + x >= rect_scr_h)  /*直线两端溢出*/
         {
            len = length = rect_scr_h + 1;
            xx = x = 0;
         }
         else                          /*直线左边溢出*/
         {
            len = (length = width + 1) + x;
            x = 0;
         }
      }
      else
      {
         return -1;
      }

      page = (char)((addr = ((long)y + g_sl_offset) * g_screen_h + x) >> 15);
      if (page == (addr + length) >> 15)
      {
         int far *d_tmp = (int far *)(g_videoptr + ((addr<<1) & 0xffff));

         if (g_cur_vbe_page != page)
         {
            set_vbe_page(page);
         }
         for (k = g_rect_left; k < len; ++k)
         {
            #ifndef NEO_draw_mode_unused
            switch(g_draw_mode)
            {
               case COPY_PUT : d_tmp[k] = color; break;
               case XOR_PUT  : d_tmp[k] = d_tmp[k] ^ color; break;
               case NOT_PUT  : d_tmp[k] = ~d_tmp[k]; break;
               case OR_PUT   : d_tmp[k] = d_tmp[k] | color; break;
               case AND_PUT  : d_tmp[k] = d_tmp[k] & color; break;
            }
            #else
            d_tmp[k] = color;
            #endif
         }
      }
      else
      {
         for (k = g_rect_left;k < length; ++k)
            dot(k + xx, y, color);
      }
      #else
      x += 0; y += 0; width += 0; color += 0;
      #endif
      return 0;
   }
}


#ifndef  NEO_hi_graphics_h_used
void  rect(int x0, int y0, int x1, int y1, int color)
{
   line(x0,y0,x0,y1,color);
   line(x0,y0,x1,y0,color);
   line(x0,y1,x1,y1,color);
   line(x1,y1,x1,y0,color);
}
#else
void  rect(int x0, int y0, int x1, int y1, int color)
{
   setcolor(color);
   line(x0, y0, x0, y1);
   line(x0, y0, x1, y0);
   line(x0, y1, x1, y1);
   line(x1, y1, x1, y0);

}
#endif


#ifndef  NEO_hi_graphics_h_used
void  tri(int xa, int ya, int xb, int yb, int xc, int yc, int col)
{
   line(xa, ya, xb, yb,col);
   line(xb, yb, xc, yc,col);
   line(xc, yc, xa, ya,col);
}
#else
void  tri(int xa, int ya, int xb, int yb, int xc, int yc, int col)
{
   setcolor(col);
   line(xa, ya, xb, yb);
   line(xb, yb, xc, yc);
   line(xc, yc, xa, ya);
}
#endif


void rectfill(int x1, int y1, int x2, int y2, int color)
{
   int delta, temp;

   if (x1 > x2)
   {
      temp = x1; x1 = x2; x2 = temp;
   }
   if (y1 > y2)
   {
      temp = y1; y1 = y2; y2 = temp;
   }
   delta = x2 - x1;
   for (temp=y1; temp<=y2; ++temp)
   {
      hline(x1, temp, delta, color);
   }
}


#ifndef  NEO_hi_graphics_h_used
/*画圆函数,以(c_x, c_y)为中心画一半径为r的圆*/
void circle(int c_x, int c_y, int r, unsigned char color)
{
   int x = 0, y = r, d0, d1, d2, direction;
   /*x = 0; y = r;*/
   d0 = (1-r)<<1;

   while (y >= 0)
   {
      dot(c_x + x, c_y + y, color);
      dot(c_x - x, c_y - y, color);
      dot(c_x + x, c_y - y, color);
      dot(c_x - x, c_y + y, color);
      if (d0 < 0)
      {
         d1 = (d0 + y)<<1 -1;
         if (d1 <= 0) direction = 1;
         else direction = 2;
      }
      else if (d0 > 0)
      {
         d2 = (d0-x)<<1 - 1;
         if (d2 <= 0) direction = 2;
         else direction = 3;
      }
      else direction = 2;

      switch(direction)
      {
        case 1 : ++x;
           d0 += (x<<1) + 1;
        break;

        case 2 : ++x;
           --y;
           d0+=(x-y+1)<<1;
        break;

        case 3 : --y;
           d0 += -(y<<1) + 1;
        break;
      }
   }
}
#else
void circle(int c_x, int c_y, int r)
{
   int x = 0, y = r, d0, d1, d2, direction;
   d0 = (1-r)<<1;

   while (y >= 0)
   {
      dot(c_x + x, c_y + y, g_frt_color);
      dot(c_x - x, c_y - y, g_frt_color);
      dot(c_x + x, c_y - y, g_frt_color);
      dot(c_x - x, c_y + y, g_frt_color);
      if (d0 < 0)
      {
         d1 = (d0 + y)<<1 -1;
         if (d1 <= 0) direction = 1;
         else direction = 2;
      }
      else if (d0 > 0)
      {
         d2 = (d0-x)<<1 - 1;
         if (d2 <= 0) direction = 2;
         else direction = 3;
      }
      else direction = 2;

      switch(direction)
      {
        case 1 : ++x;
           d0 += (x<<1) + 1;
        break;

        case 2 : ++x;
           --y;
           d0+=(x-y+1)<<1;
        break;

        case 3 : --y;
           d0 += -(y<<1) + 1;
        break;
      }
   }
}
#endif


#ifndef  NEO_hi_graphics_h_used
void circlefill(int x, int y, int r, int c)
{
   int i;

   for (i = 0; i < r; ++i)
   {
      circle(x, y, i, c);
   }
}
#else
void circlefill(int x, int y, int r, int c)
{
   int i;
   setcolor(c);
   for (i = 0; i < r; ++i)
   {
      circle(x, y, i);
   }
}
#endif


#ifndef  NEO_hi_graphics_h_used
/*以(x0,y0)为中心、a和b分别为水平和垂直半轴画一椭圆*/
void ellipse(int x0,int y0,int a,int b,unsigned char color)
{
   float d1, d2;
   int x, y;

   x=0; y=b;

   d1 = b * b + a * a * (-b + 0.25);
   dot(x0 + x, y0 + y, color);
   dot(x0 - x, y0 - y, color);
   dot(x0 - x, y0 + y, color);
   dot(x0 + x, y0 - y, color);

   while ((x + 1.0f) * b * b < (y - 0.5f) * a * a)
   {
      if (d1 < 0)
      {
         d1 += (2.0f * x + 3) * b * b;
         ++x;
      }
      else
      {
         d1 += (2.0f * x + 3) * b * b + (-2.0f * y + 2) * a * a;
         ++x; --y;
      }

      dot(x0 + x, y0 + y, color);
      dot(x0 - x, y0 - y, color);
      dot(x0 - x, y0 + y, color);
      dot(x0 + x, y0 - y, color);
   }
   d2 = (x + 0.5f) * b + (y - 1.0f) * a - a * b;
   while (y > 0)
   {
      if (d2 < 0)
      {
         d2 += (2.0f * x + 2) * b * b + (-2.0f * y + 3) * a * a;
         ++x; --y;
      }
      else
      {
         d2 += (-2.0f * y + 3) * a * a;
         --y;
      }

      dot(x0 + x, y0 + y, color);
      dot(x0 - x, y0 - y, color);
      dot(x0 - x, y0 + y, color);
      dot(x0 + x, y0 - y, color);
   }
}
#else
void ellipse(int x0,int y0,int a,int b)
{
   float d1, d2;
   int x, y;

   x=0; y=b;

   d1 = b * b + a * a * (-b + 0.25);
   dot(x0 + x, y0 + y, g_frt_color);
   dot(x0 - x, y0 - y, g_frt_color);
   dot(x0 - x, y0 + y, g_frt_color);
   dot(x0 + x, y0 - y, g_frt_color);

   while ((x + 1.0f) * b * b < (y - 0.5f) * a * a)
   {
      if (d1 < 0)
      {
         d1 += (2.0f * x + 3) * b * b;
         ++x;
      }
      else
      {
         d1 += (2.0f * x + 3) * b * b + (-2.0f * y + 2) * a * a;
         ++x; --y;
      }

      dot(x0 + x, y0 + y, g_frt_color);
      dot(x0 - x, y0 - y, g_frt_color);
      dot(x0 - x, y0 + y, g_frt_color);
      dot(x0 + x, y0 - y, g_frt_color);
   }
   d2 = (x + 0.5f) * b + (y - 1.0f) * a - a * b;
   while (y > 0)
   {
      if (d2 < 0)
      {
         d2 += (2.0f * x + 2) * b * b + (-2.0f * y + 3) * a * a;
         ++x; --y;
      }
      else
      {
         d2 += (-2.0f * y + 3) * a * a;
         --y;
      }

      dot(x0 + x, y0 + y, g_frt_color);
      dot(x0 - x, y0 - y, g_frt_color);
      dot(x0 - x, y0 + y, g_frt_color);
      dot(x0 + x, y0 - y, g_frt_color);
   }
}
#endif


void _dot(int x, int y, int color)
{
   long addr;
   int page;
   if (g_color_depth == 8)
   {
      #ifndef NEO_color_depth_8_unused
      page = (int)((addr = ((long)y + g_sl_offset) * g_screen_h + x) >> 16);

      if (g_cur_vbe_page != page)
      {
		#ifndef MSVC15
         _BX = 0;
         _DX = g_cur_vbe_page = page;
         _AX = 0x4f05;
         __int__(0x10);
		#else
		 g_cur_vbe_page = page;
		 _asm
		  {
		  mov bx,0
		  mov dx,g_cur_vbe_page 
		  mov ax,4f05h
		  int 10h
		  }
	     #endif
      }
      *(g_videoptr+(addr& 0xffff)) = (unsigned char)color;
      #else
      x = y = color;
      #endif
   }
   else /*if (g_v_mode == 1)*/
   {
      #ifndef NEO_color_depth_16_unused
      int far *videoptr = (int far *)0xa0000000;
      page = (int)((addr = ((long)y + g_sl_offset) * g_screen_h + x) >> 15);
      if (g_cur_vbe_page != page)
      {
		#ifndef MSVC15
         _BX = 0;
         _DX = g_cur_vbe_page = page;
         _AX = 0x4f05;
         __int__(0x10);
		#else
		 g_cur_vbe_page = page;
		 _asm
		  {
		  mov bx,0
		  mov dx,g_cur_vbe_page 
		  mov ax,4f05h
		  int 10h
		  }
	     #endif
      }
      *(videoptr + (addr & 0xffff)) = color;
      #else
      x = y = color;
      #endif
   }
}
#endif


void clear_to_color(int color)
{


   #ifndef NEO_rect_unused
   rect_store();
   #endif
   screen(0, 0, SCREEN_W, SCREEN_H);
   #ifndef NEO_basic_draw_unused
   rectfill(0, 0, SCREEN_W, SCREEN_H, color);
   #else
   {
      int x, y;
      for (y = 0; y < SCREEN_H; ++y)
         for (x = 0; x < SCREEN_W; ++x)
            dot(x, y, color);
   }
   #endif
   #ifndef NEO_rect_unused
   rect_restore();
   #endif

}


void clear(void)
{
   clear_to_color(0);
}


#endif

⌨️ 快捷键说明

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