📄 draw.h
字号:
#ifndef _DRAW_H_INCLUDED
#define _DRAW_H_INCLUDED
#if !defined(_ENABLE_AUTODEPEND)
#pragma read_only_file;
#endif
#ifdef __cplusplus
extern "C" {
#endif
#include"gif.h"
#include"bmp.h"
#include"pcx.h"
#include"sprite.h"
/*
"push ds"\
"push es"\
"pop ds"\
"pop es"\
*/
void blit8(unsigned,unsigned,unsigned char *,unsigned char *,int)
{
#pragma aux blit8=\
".586p"\
".387"\
"mov ds,ax"\
"mov es,bx"\
"push ecx"\
"shr ecx,2"\
"cld"\
"rep movsd"\
"pop ecx"\
"and ecx,11b"\
"rep movsb"\
parm[ax][bx][edi][esi][ecx];
}
void clear(BITMAP *bitmap)
{
memset(bitmap->dat,0,bitmap->w*bitmap->h);
}
void clean_bitmap(BITMAP *bmp,unsigned char col)
{
memset(bmp->dat,col,bmp->w*bmp->h);
}
void clear_to_color(BITMAP *bitmap,unsigned char col)
{
memset(bitmap->dat,col,bitmap->w*bitmap->h);
}
void clear_xy(BITMAP *bmp,int x,int y,int w,int h,unsigned char col)
{
for(int y1=y;y1<h;y1++)
memset(bmp->dat+x+y1*bmp->w,col,w);
}
//画点
void putpixel(BITMAP *bitmap,int x,int y,unsigned char col)
{if(x>=0&&x<bitmap->w&&y>=0&&y<bitmap->h)
*(*(bitmap->line+y)+x)=col;
}
//渐隐
//读点
unsigned char getpixel(BITMAP *bitmap,int x,int y)
{
if(x>=0&&x<bitmap->w&&y>=0&&y<bitmap->h)
{
return *(*(bitmap->line+y)+x);
}else
return 0;
}
unsigned char Mix(unsigned char souCol,unsigned char desCol,float num)
{RGB srgb,drgb;
static unsigned char Col=-1;
if(Col!=desCol){GetRgb(desCol,&drgb);Col=desCol;}
GetRgb(souCol,&srgb);
return get_color((srgb.r+drgb.r)/num,(srgb.g+drgb.g)/num,(srgb.b+drgb.b)/num);
}
void GetRgb(unsigned char Index,RGB *rgb)
{ rgb->r=SystemPal[Index].r;
rgb->g=SystemPal[Index].g;
rgb->b=SystemPal[Index].b;
}
void SetRgb(unsigned char Index,RGB *rgb)
{ waitVR();
SystemPal[Index].r=rgb->r;
SystemPal[Index].g=rgb->g;
SystemPal[Index].b=rgb->b;
outp(0x3c8,Index);
outp(0x3c9,rgb->r);
outp(0x3c9,rgb->g);
outp(0x3c9,rgb->b);
}
unsigned char get_color(char r,char g,char b)
{unsigned char i ,Min=255;
register unsigned char rr,rg,rb,dr,dg,db,ret;
for(i=0;i<255;i++)
{
rr=SystemPal[i].r;
rg=SystemPal[i].g;
rb=SystemPal[i].b;
dr=(rr>r)?rr-r:r-rr;
dg=(rg>g)?rg-g:g-rg;
db=(rb>b)?rb-b:b-rb;
if(!(dr+dg+db)){ ret=i; return ret; }
if(dr+dg+db<Min) {Min=dr+dg+db;ret=i;}
}
return ret;
}
//画水平线
void hline(BITMAP *bitmap ,int x,int y,int x1,unsigned char col)
{ int tmpx;
for(tmpx=x;tmpx<x1;tmpx++)
putpixel(bitmap,tmpx,y,col);
}
//垂直线
void vline(BITMAP *bitmap,int x,int y,int y1,unsigned char col)
{ int tmpy;
for(tmpy=y;tmpy<y1;tmpy++)
putpixel(bitmap,x,tmpy,col);
}
//显示256色PCX图像
BITMAP *load_bitmap(char *file,char bloot)
{char len,*exam;
len=strlen(file);
exam=file+len-4;
if(strcmpi(strupr(exam),".PCX")==0)return load_pcx(file,bloot);
if(strcmpi(strupr(exam),".BMP")==0)return load_bmp(file);
if(strcmpi(strupr(exam),".GIF")==0)return load_gif(file,bloot);
return FALSE;
}
void blit(BITMAP *bitmap,BITMAP *desbitmap,int x,int y,int x1,int y1,int w,int h)
{ register unsigned char *_bak1,*_bak2;
// _bak1=bitmap->dat;
// _bak2=desbitmap->dat;
// _bak1+=x+y*bitmap->w;
// _bak2+=x1+y1*desbitmap->w;
_bak1=*(bitmap->line+y)+x;
_bak2=*(desbitmap->line+y1)+x1;
for(register int i=0;i<h;i++)
{
blit8(FP_SEG(_bak1),FP_SEG(_bak2),_bak1,_bak2,w);
// _bak1+=bitmap->w;
// _bak2+=desbitmap->w;
_bak1=*(bitmap->line+i+y)+x;
_bak2=*(desbitmap->line+i+y1)+x1;
}
}
void ScaleImage(BITMAP *bitmap,BITMAP *bmp,int x,int y)
{register int i,j,x1,y1;
x1=bmp->w;
y1=bmp->h;
float bitx=bmp->bitx;
float bity=bmp->bity;
unsigned char col;
x1*=bitx;
y1*=bity;
for(j=0;j<y1;j++)
for(i=0;i<x1;i++)
{
col=*(*(bmp->line+(int)(j/bity))+(int)(i/bitx));
putpixel(bitmap,x+i,y+j,col);
}
}
void SizeImage(BITMAP *bitmap,BITMAP *bmp,int x,int y,int w,int h)
{
bmp->bitx=(float)(w)/bmp->w;
bmp->bity=(float)(h)/bmp->h;
ScaleImage(bitmap,bmp,x,y);
}
unsigned char bmp_mask_color(BITMAP *bitmap)
{return bitmap->MskCol;}
char is_same_bitmap(BITMAP *s,BITMAP *d)
{if(s==d)return TRUE;
else return FALSE;
}
char is_linear_bitmap(BITMAP *bitmap)
{return TRUE;}
void masked_blit(BITMAP *source,BITMAP *dest,int x,int y,int x1,int y1,int w,int h)
{
register int i,j;
register unsigned char data=0;
for(i=0;i<h;i++)
{
for(j=0;j<w;j++)
if((data=*(dest->dat+(y1+i)*dest->w+x1+j))!=dest->MskCol)
*(source->dat+(y+i)*source->w+x+j)=data;
}
}
void Alph_init()
{
register short i,j;
RGB s,s1;
unsigned char col;
for(i=0;i<256;i++)
for(j=0;j<256;j++)
{GetRgb(j,&s);
GetRgb(i,&s1);
col=get_color((s.r+s1.r)>>1,(s.g+s1.g)>>1,(s.b+s1.b)>>1);
Color_MAP.data[i][j]=col;
}
}
//设置颜色
void setcolor(unsigned char col){_COLOR=col;}
//填充园
void circlefill(BITMAP *bitmap,int x,int y,int radius,unsigned char col)
{
register int
cx=0,
cy=radius,
df=1-radius,
d_e=3,
d_se=-2*radius+5;
do{
hline(bitmap,x-cy,y-cx,x+cy,col);
if(cx){
hline(bitmap,x-cy,y+cx,x+cy,col);}
if(df<0){
df+=d_e;
d_e+=2;
d_se+=2;
}else
{if(cx!=cy){
hline(bitmap,x-cx,y-cy,x+cx,col);
if(cy)
hline(bitmap,x-cx,y+cy,x+cx,col);
}
df+=d_se;
d_e+=2;
d_se+=4;
cy--;
}
cx++;
}while(cx<=cy);
}
//画园
void circle(BITMAP *bitmap,int x_center,int y_center,int radius,unsigned char col)
{
register int y,delta,x;
y=radius;
delta=3-(radius<<1);
for (x=0;x<=y;)
{
putpixel(bitmap,x+x_center,y+y_center,col);
putpixel(bitmap,x+x_center,-y+y_center,col);
putpixel(bitmap,-x+x_center,-y+y_center,col);
putpixel(bitmap,-x+x_center,y+y_center,col);
putpixel(bitmap,y+x_center,x+y_center,col);
putpixel(bitmap,y+x_center,-x+y_center,col);
putpixel(bitmap,-y+x_center,-x+y_center,col);
putpixel(bitmap,-y+x_center,x+y_center,col);
if (delta<0) delta+=(x<<2)+6;
else { delta+=((x-y)<<2)+10; y--;}
x++;
}
}
void plotcircle(int x,int y,int x_center,int y_center,double asp_ratio,BITMAP *bitmap,unsigned char col)
{
register double startx,endx,x1,starty,endy,y1;
starty=y*asp_ratio; endy=(y+1)*asp_ratio;
startx=x*asp_ratio; endx=(x+1)*asp_ratio;
for (x1=startx;x1<endx;++x1)
{
putpixel(bitmap,x1+x_center,y+y_center,col);
putpixel(bitmap,x1+x_center,-y+y_center,col);
putpixel(bitmap,-x1+x_center,-y+y_center,col);
putpixel(bitmap,-x1+x_center,y+y_center,col);
}
for (y1=starty;y1<endy;++y1)
{
putpixel(bitmap,y1+x_center,x+y_center,col);
putpixel(bitmap,y1+x_center,-x+y_center,col);
putpixel(bitmap,-y1+x_center,-x+y_center,col);
putpixel(bitmap,-y1+x_center,x+y_center,col);
}
}
//椭园
void ellipse(BITMAP *bitmap,int x_center,int y_center,int x_radius,int y_radius,unsigned char col)
{ double asp_ratio;
register int x,y,delta;
asp_ratio=x_radius;
asp_ratio/=y_radius;
y=y_radius;
delta=3-(x_radius<<1);
for (x=0;x<=y;)
{
plotcircle(x,y,x_center,y_center,asp_ratio,bitmap,col);
if (delta<0) delta+=(x<<2)+6;
else { delta+=((x-y)<<2)+10; y--;}
x++;
}
}
void barA(BITMAP *bitmap,int x,int y,int x1,int y1,unsigned char col)
{ int x2,y2;
for(x2=x;x2<x1;x2+=2)
for(y2=y;y2<y1;y2+=2)
putpixel(bitmap,x2,y2,col);
}
void rectfill(BITMAP *bitmap,int x,int y,int x1,int y1,unsigned char col)
{ for(int i=y;i<y1;i++)
line(bitmap,x,i,x1,i,col);
}
void rect(BITMAP *bitmap,int x,int y,int top,int bom,unsigned char col)
{ line(bitmap,x,y,top,y,col);
line(bitmap,x,y,x,bom,col);
line(bitmap,top,y,top,bom,col);
line(bitmap,x,bom,top,bom,col);
}
//从bitmap读取一行存入buf
void bmp_read_line(BITMAP *bitmap,int y,unsigned char *buf)
{
blit8(FP_SEG(buf),FP_SEG(bitmap->dat),buf,bitmap->line[y],bitmap->w);
}
//从x=0到x=width读取数据到buf
void bmp_read_width(BITMAP *bitmap,int width,int y,unsigned char *buf)
{
blit8(FP_SEG(buf),FP_SEG(bitmap->line[y]),buf,bitmap->line[y],width);
}
//从buf读取一行写入bitmap
void bmp_write_line(BITMAP *bitmap,int y,unsigned char *buf)
{
blit8(FP_SEG(bitmap->line[y]),FP_SEG(buf),bitmap->line[y],buf,bitmap->w);
}
//从buf读取一行写入bitmap的x=0到x=width
void bmp_write_width(BITMAP *bitmap,int width,int y,unsigned char *buf)
{
blit8(FP_SEG(bitmap->line[y]),FP_SEG(buf),bitmap->line[y],buf,width);
}
char is_same_sprite(BITMAP *bmp)
{if(bmp->line[0])return FALSE;
return TRUE;
}
void ling(BITMAP *bitmap,int top,int x,int y,int width,int bom,unsigned char col)
{line(bitmap,x,y,x+(width>>1),top,col);
line(bitmap,x,y,x+(width>>1),bom,col);
line(bitmap,x+(width>>1),top,x+width,y,col);
line(bitmap,x+(width>>1),bom,x+width,y,col);
}
void box3d(BITMAP *bitmap,int x,int y,int x1,int y1,int width,unsigned char col)
{setcolor(col);int tmp=0;
if(x1<x){tmp=x;x=x1;x1=tmp;}
if(y1<y){tmp=y;y=y1;y1=tmp;}
line(bitmap,x,y,x+width,y-width);
line(bitmap,x,y,x+width,y-width);
line(bitmap,x1,y,x1+width,y-width);
line(bitmap,x+width,y-width,x1+width,y-width);
line(bitmap,x1+width,y-width,x1+width,y1-width);
line(bitmap,x1,y1,x1+width,y1-width);
line(bitmap,x,y1,x+width,y1-width);
line(bitmap,x+width,y-width,x+width,y1-width);
line(bitmap,x+width,y1-width,x1+width,y1-width);
rect(bitmap,x,y,x1,y1);
}
void poly(BITMAP *bmp,int num,int *points,unsigned char color)
{ int j;
setcolor(color);
if (num<=0) return;
if (num==1) { putpixel(bmp,points[0],points[1],color); return; }
if (num==2) { line(bmp,points[0],points[1],points[2],points[3]); return; }
for (j=0;j<(num-1)*2;j+=2)
line(bmp,points[j],points[j+1],points[j+2],points[j+3]);
line(bmp,points[0],points[1],points[j],points[j+1]);
}
void Mix_blit(BITMAP *bmp,BITMAP *mask,BITMAP *bmp2,int x,int y)
{
register int i,j;unsigned char col1;
for(j=0;j<mask->h;j++)
for(i=0;i<mask->w;i++)
if((col1=*(*(mask->line+j)+i)))
*(*(screen->line+j+y)+x+i)=*(*(bmp2->line+j+y)+i+x);
}
void bitmap_copy(BITMAP *bmp,BITMAP *p)
{
if((bmp->w-p->w))return;
if((bmp->h-p->h))return;
if(!(bmp->dat)||!(p->w))return;
memcpy(bmp,p,sizeof(p));
memcpy(bmp->dat,p->dat,p->w*p->h);
}
#ifdef __cplusplus
};
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -