📄 n2d.h
字号:
/*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
文件名称 : n2d.h
摘 要 : 本头文件包含了NEO SDK里的各种基本图形函数、结构、全局变量的声明及定义
当前版本 : 2.77
作 者 : 董凯
完成日期 : 2005.6.28
取代版本 : 2.76
原 作 者 : 董凯
完成日期 : 2005.6.22
*/
#ifndef N2D_H
#define N2D_H
/*如果启用兼容Borland graphics.h功能则执行下列操作*/
#ifdef NEO_hi_graphics_h_used
/*检查是否已经包含Borland graphics.h*/
#ifdef USER_CHAR_SIZE
#if VERT_DIR
#error Please don't include graphics.h!
#endif
#endif
/*启用绘图模式*/
#define NEO_draw_mode_used
#define closegraph() set_vbe_mode(0x3)
#define getgraphmode() get_vbe_mode()
#define setgraphmode(mode) set_vbe_mode(mode)
#define setviewport(l, t, r, b,c) c?screen(l, t, r, b):0
#define getmaxx() max_x()
#define getmaxy() max_y()
#define setwritemode(mode) set_draw_mode(mode)
#define setcolor(color) (g_frt_color = color)
#define setbkcolor(color) clear_to_color(color)
#define getcolor(color) g_frt_color
#define setrgbpalette(cn, r, g,b) set_color(cn, r, g, b)
#define putpixel(x, y, color) dot(x, y, color)
#define getpixel(x, y) get_dot(x, y)
#define bar(x0, y0, x1, y1) rectfill(x0-1, y0-1, x1-1, y1-1, g_frt_color)
#define rectangle(x0, y0, x1, y1) rect(x0, y0, x1, y1, g_frt_color)
#define textcolor(color) set_str_color(color)
#define outtextxy(x, y, str) textout(str, x, y)
#define setactivepage(page_num) set_work_surface(page_num)
#define setvisualpage(page_num) flip_surface(page_num)
#define setfillstyle(pattern, color)
#define cleardevice() clear()
#endif
int g_vtotal, g_htotal; /*滚屏例程使用*/
/*======================================================*
* 函数声明(Function declare) *
*======================================================*/
void dot(int x,int y,int color);
int get_dot(int x, int y);
#ifndef NEO_hi_graphics_h_used
void line(int x1, int y1, int x2, int y2, unsigned color);
void circle(int c_x, int c_y, int r, unsigned char color);
void ellipse(int x0, int y0, int a, int b, unsigned char color);
#else
void line(int x1, int y1, int x2, int y2);
void circle(int c_x, int c_y, int r);
void ellipse(int x0, int y0, int a, int b);
#endif
char hline(int x, int y, int width, unsigned color);
void vline(int x, int y, int height,unsigned color);
void rect(int x0, int y0, int x1, int y1, int color);
void tri(int xa, int ya, int xb, int yb, int xc, int yc, int col);
void rectfill(int x1, int y1, int x2, int y2, int color);
void circlefill(int x, int y, int r, int c);
void _dot(int x,int y,int color);
void clear(void);
void clear_to_color(int color);
/*通用画点函数,速度:17FPS*/
void dot(int x,int y,int color)
{
long addr;
int page;
if ((x<g_rect_left) || (y<g_rect_top) || (x>g_rect_right) || (y>g_rect_bottom)) return;
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
}
#ifndef NEO_draw_mode_unused
switch(g_draw_mode)
{
case COPY_PUT : *(g_videoptr+(addr&0xffff))= color;break;
case XOR_PUT : *(g_videoptr+(addr&0xffff))= *(g_videoptr+(addr& 0xffff))^(char)color;break;
case NOT_PUT : *(g_videoptr+(addr&0xffff))=~*(g_videoptr+(addr& 0xffff));break;
case OR_PUT : *(g_videoptr+(addr&0xffff))= *(g_videoptr+(addr& 0xffff))|(char)color;break;
case AND_PUT : *(g_videoptr+(addr&0xffff))= *(g_videoptr+(addr& 0xffff))&(char)color;break;
}
#else
*(g_videoptr+(addr& 0xffff)) = (unsigned char)color;
#endif
#else
x += 0; y+=0; color+=0;
#endif
}
else /*if (g_color_depth == 16)*/ /*由于NEO目前只支持256和64K色,所以暂时注释左边一句*/
{
#ifndef NEO_color_depth_16_unused
int far *videoptr16 = (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
}
#ifndef NEO_draw_mode_unused
switch(g_draw_mode)
{
case COPY_PUT : *(videoptr16+(addr&0xffff)) = color;break;
case XOR_PUT : *(videoptr16+(addr&0xffff))= *(videoptr16+(addr& 0xffff)) ^ color;break;
case NOT_PUT : *(videoptr16+(addr&0xffff))=~*(videoptr16+(addr& 0xffff)); break;
case OR_PUT : *(videoptr16+(addr&0xffff))= *(videoptr16+(addr& 0xffff)) | color;break;
case AND_PUT : *(videoptr16+(addr&0xffff))= *(videoptr16+(addr& 0xffff)) & color;break;
}
#else
*(videoptr16 + (addr & 0xffff)) = color;
#endif
#else
x += 0; y+=0; color+=0;
#endif
}
}
int get_dot(int x, int y)
{
long addr;
int page;
if ((x<0) || (y<0) || (x>g_screen_h) || (y>g_screen_v)) return -1;
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
}
return (peekb(0xa000,addr & 0xFFFF));
#else
x += 0; y+=0;
#endif
}
else
{
#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
}
return *(videoptr + (addr & 0xffff));
#else
x += 0; y+=0;
#endif
}
}
#ifndef NEO_basic_draw_unused
#ifndef NEO_hi_graphics_h_used
/*通用的画线函数,用color颜色由(x1,y1)画到(x2,y2);速度:(16FPS)*/
void line(int x1, int y1, int x2, int y2, unsigned color)
{
int dt_x = x2 - x1, dt_y = y2 - y1, step_x, step_y, change;
if (dt_x < 0)
{
dt_x = -dt_x; /*从右向左画线*/
step_x = -1;
}
else {step_x = 1;} /*从左向右画线*/
if (dt_y < 0)
{
dt_y = -dt_y; /*从下向上画线*/
step_y = -1;
}
else {step_y = 1;}
/*从上向下画线*/
if (dt_x > dt_y) /*x改变得比y快*/
{
change = dt_x >> 1;
while (x1 != x2)
{
dot(x1, y1, color);
x1 += step_x;
change += dt_y;
if(change > dt_x)
{
y1 += step_y;
change -= dt_x;
}
}
}
else /*y改变得比x快*/
{
change = dt_y >> 1;
while(y1 != y2)
{
dot(x1, y1, color);
y1 += step_y;
change += dt_x;
if(change > dt_y)
{
x1 += step_x;
change -= dt_y;
}
}
}
dot(x2, y2, color);
}
#else
void line(int x1, int y1, int x2, int y2)
{
int dt_x = x2 - x1, dt_y = y2 - y1, step_x, step_y, change;
if (dt_x < 0)
{
dt_x = -dt_x; /*从右向左画线*/
step_x = -1;
}
else {step_x = 1;} /*从左向右画线*/
if (dt_y < 0)
{
dt_y = -dt_y; /*从下向上画线*/
step_y = -1;
}
else {step_y = 1;}
/*从上向下画线*/
if (dt_x > dt_y) /*x改变得比y快*/
{
change = dt_x >> 1;
while (x1 != x2)
{
dot(x1, y1, g_frt_color);
x1 += step_x;
change += dt_y;
if(change > dt_x)
{
y1 += step_y;
change -= dt_x;
}
}
}
else /*y改变得比x快*/
{
change = dt_y >> 1;
while(y1 != y2)
{
dot(x1, y1, g_frt_color);
y1 += step_y;
change += dt_x;
if(change > dt_y)
{
x1 += step_x;
change -= dt_y;
}
}
}
dot(x2, y2, g_frt_color);
}
#endif
/*优化后的画水平线函数,用color颜色由(x,y)向右画长为width的水平线;速度: 8位65FPS; 16位32FPS*/
char hline(int x, int y, int width, unsigned color)
{
long addr;
int k = 0;
int xx = x;
int rect_scr_h = g_rect_right + 1;
int len = 0, length/*直线有效长度*/ = 0;
char page, odd;
int fix;
if (width < 0)
{
x -= width;
width = -width;
}
if (g_color_depth == 8)
{
#ifndef NEO_color_depth_8_unused
int origin = 0;
unsigned char color8 = (unsigned char)color;
unsigned int color16 = color8 << 8;
if ( (y > g_rect_bottom) || (y < g_rect_top) || width < 0)
{
return -1;
}
if (x >= 0 && x < rect_scr_h)
{
if (rect_scr_h - x >= width) /*直线完全显示*/
{
fix = (x <= g_rect_left? x>>1 : g_rect_left>>1);
len = length = width + 1;
}
else /*直线右边溢出*/
{
if (x > g_rect_left)
{
x = x - g_rect_left;
}
else fix = x>>1;
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;
}
color16 += color8;
len >>= 1;
length -= (odd = length % 2);
origin = (g_rect_left >> 1) - fix;
page = (char)((addr = ((long)y + g_sl_offset) * g_screen_h + x) >> 16);
if (page == (addr + length) >> 16)
{
int far *d_tmp = (int far *)(g_videoptr + (addr & 0xffff));
if (g_cur_vbe_page != page)
{
set_vbe_page(page);
}
for (; origin < len; ++origin)
{
#ifndef NEO_draw_mode_unused
switch(g_draw_mode)
{
case COPY_PUT : d_tmp[origin] = color16; break;
case XOR_PUT : d_tmp[origin] = d_tmp[origin] ^ color16; break;
case NOT_PUT : d_tmp[origin] = ~d_tmp[origin]; break;
case OR_PUT : d_tmp[origin] = d_tmp[origin] | color16; break;
case AND_PUT : d_tmp[origin] = d_tmp[origin] & color16; break;
}
#else
d_tmp[origin] = color16;
#endif
}
}
else
{
for (;k < length; ++k)
dot(k + xx, y,color8);
}
if (odd) dot(xx + length, y, color8);
#else
x += 0; y += 0; width += 0; color += 0;
#endif
return 0;
}
else
{
#ifndef NEO_color_depth_16_unused
if ( (y > g_rect_bottom) || (y < g_rect_top) || width < 0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -