📄 gui16.cpp
字号:
#include <fstream.h>
#include "gui16.h"
LPDIRECTDRAW lpDD; // DirectDraw object
inline WORD RGBto16bit(DDPIXELFORMAT* pixFormat,unsigned char r,unsigned char g,unsigned char b)
{ if(pixFormat->dwGBitMask == 0x07e0)
return (((WORD)r<<8)&0xf800)|(((WORD)g<<3)&0x07e0)|((WORD)b>>3);
else
return (((WORD)r<<7)&0x7c00)|(((WORD)g<<2)&0x03e0)|((WORD)b>>3);
}
inline void writePixel(DDSURFACEDESC* ddsd,int x,int y,WORD color)
{ if(x<0||y<0||x>=ddsd->dwWidth||y>=ddsd->dwHeight)
return;
WORD* p = (WORD*)ddsd->lpSurface;
*(p + (ddsd->lPitch>>1) * y + x) = color;
}
inline void line(DDSURFACEDESC* ddsd,int x1,int y1,int x2,int y2,WORD color)
{ int a,b,dx,dy,dxa,dyb,x,y,pk,twodxa,twodyb;
WORD* p = (WORD*)ddsd->lpSurface;
long pitch = ddsd->lPitch>>1;
long pitchb;
x = x1;
y = y1;;
dx = x2 - x1;
dy = y2 - y1;
p += pitch * y + x;
*p = color;
if(dx > 0)
a = 1;
else if(dx < 0)
a = -1;
else
{ if(dy > 0)
b = 1;
else if(dy < 0)
b = -1;
else
return;
pitchb = pitch * b;
while(y!=y2)
{ y += b;
p += pitchb;
*p = color;
}
return;
}
if(dy > 0)
b = 1;
else if(dy < 0)
b = -1;
else
{ while(x!=x2)
{ x+=a;
p += a;
*p = color;
}
return;
}
dxa = dx*a;
dyb = dy*b;
twodxa = 2*dxa;
twodyb = 2*dyb;
pitchb = pitch * b;
if(dxa >= dyb)
{ int twodyb_dxa = twodyb - twodxa;
pk = twodyb - dxa;
while(x != x2)
{ x+=a;
if(pk<0)
{ pk+=twodyb;
p += a;
*p = color;
}
else
{ pk+=twodyb_dxa;
p += pitchb + a;
*p = color;
}
}
}
else
{ int twodxa_dyb = twodxa - twodyb;
pk = twodxa - dyb;
while(y != y2)
{ y+=b;
if(pk<0)
{ pk+=twodxa;
p += pitchb;
*p = color;
}
else
{ pk+= twodxa_dyb;
p += pitchb + a;
*p = color;
}
}
}
}
void lineS(DDSURFACEDESC* ddsd,int x1,int y1,int x2,int y2,WORD color)
{ int a,b,dx,dy,dxa,dyb,x,y,pk,twodxa,twodyb,ck,ckd1,ckd2;
WORD colors[9];
WORD* p = (WORD*)ddsd->lpSurface;
long pitch = ddsd->lPitch>>1;
long pitchb;
x = x1;
y = y1;;
dx = x2 - x1;
dy = y2 - y1;
p += pitch * y + x;
*p = color;
if(dx > 0)
a = 1;
else if(dx < 0)
a = -1;
else
{ if(dy > 0)
b = 1;
else if(dy < 0)
b = -1;
else
return;
pitchb = pitch * b;
while(y!=y2)
{ y+=b;
p += pitchb;
*p = color;
}
return;
}
if(dy > 0)
b = 1;
else if(dy < 0)
b = -1;
else
{ while(x!=x2)
{ x+=a;
p += a;
*p = color;
}
return;
}
WORD f8,f4,f2;
if(ddsd->ddpfPixelFormat.dwGBitMask == 0x07e0)
{ f8 = (color&0xc718)>>3;
f4 = (color&0xe79c)>>2;
f2 = (color&0xf7de)>>1;
}
else
{ f8 = (color&0x6318)>>3;
f4 = (color&0x739c)>>2;
f2 = (color&0x7bde)>>1;
}
colors[1] = f8;
colors[2] = f4;
colors[3] = f2;
colors[4] = f2;
colors[5] = f2+f8;
colors[6] = f2+f4;
colors[7] = f2+f4+f8;
colors[0] = f8;
colors[8] = colors[7];
dxa = dx*a;
dyb = dy*b;
int dx8 = dxa*8;
int dy8 = dyb*8;
twodxa = 2*dxa;
twodyb = 2*dyb;
pitchb = pitch * b;
if(dxa >= dyb)
{ ckd1 = -(dyb*8);
ckd2 = dxa*8 + ckd1;
int twodyb_dxa = twodyb - twodxa;
pk = twodyb - dxa;
ck = 4*dxa-4*pk;
while(x != x2)
{ x+=a;
if(pk<0)
{ pk+=twodyb;
p += a;
*p = colors[ck/dxa];
*(p+pitchb) = colors[8-ck/dxa];
ck += ckd1;
if(ck < 0)
ck = 0;
}
else
{ pk+=twodyb_dxa;
p += a;
*p = colors[ck/dxa];
p += pitchb;
*p = colors[8-ck/dxa];
ck += ckd2;
if(ck > dx8)
ck = dx8;
}
}
}
else
{ ckd1 = -(dxa*8);
ckd2 = dyb*8 + ckd1;
int twodxa_dyb = twodxa - twodyb;
pk = twodxa - dyb;
ck = 4*dyb-4*pk;
while(y != y2)
{ y+=b;
if(pk<0)
{ pk+=twodxa;
p += pitchb;
*p = colors[ck/dyb];
*(p+a) = colors[8 - ck/dyb];
ck += ckd1;
if(ck < 0)
ck = 0;
}
else
{ pk+=twodxa_dyb;
p += pitchb;
*p = colors[ck/dyb];
p += a;
*p = colors[8 - ck/dyb];
ck += ckd2;
if(ck > dy8)
ck = dy8;
}
}
}
}
inline void calColor(DDSURFACEDESC* ddsd,WORD* colors,WORD color)
{ WORD f8,f4,f2;
if(ddsd->ddpfPixelFormat.dwGBitMask == 0x07e0)
{ f8 = (color&0xc718)>>3;
f4 = (color&0xe79c)>>2;
f2 = (color&0xf7de)>>1;
}
else
{ f8 = (color&0x6318)>>3;
f4 = (color&0x739c)>>2;
f2 = (color&0x7bde)>>1;
}
colors[1] = f2+f4+f8;//f8;
colors[2] = f2+f4;//f4;
colors[3] = f2;//f2;
colors[4] = f2;//f2;
colors[5] = f4+f8;//f2+f8;
colors[6] = f4;//f2+f4;
colors[7] = f8;//f2+f4+f8;
colors[0] = colors[1];//f8;
colors[8] = colors[7];
}
void lineS2(DDSURFACEDESC* ddsd,int x1,int y1,int x2,int y2,WORD color)
{ int a,b,dx,dy,dxa,dyb,x,y,pk,twodxa,twodyb,ck,ckd1,ckd2;
WORD colors[9];
WORD colors1[9];
WORD fixColor = 0;
WORD* p = (WORD*)ddsd->lpSurface;
long pitch = ddsd->lPitch>>1;
long pitchb;
x = x1;
y = y1;;
dx = x2 - x1;
dy = y2 - y1;
p += pitch * y + x;
*p = color;
if(dx > 0)
a = 1;
else if(dx < 0)
a = -1;
else
{ if(dy > 0)
b = 1;
else if(dy < 0)
b = -1;
else
return;
pitchb = pitch * b;
while(y!=y2)
{ y+=b;
p += pitchb;
*p = color;
}
return;
}
if(dy > 0)
b = 1;
else if(dy < 0)
b = -1;
else
{ while(x!=x2)
{ x+=a;
p += a;
*p = color;
}
return;
}
WORD f8,f4,f2;
colors1[0] = 0;
colors1[1] = 0;
colors1[2] = 0;
colors1[3] = 0;
colors1[4] = 0;
colors1[5] = 0;
colors1[6] = 0;
colors1[7] = 0;
colors1[8] = 0;
if(ddsd->ddpfPixelFormat.dwGBitMask == 0x07e0)
{ f8 = (color&0xc718)>>3;
f4 = (color&0xe79c)>>2;
f2 = (color&0xf7de)>>1;
}
else
{ f8 = (color&0x6318)>>3;
f4 = (color&0x739c)>>2;
f2 = (color&0x7bde)>>1;
}
colors[1] = f8;
colors[2] = f4;
colors[3] = f2;
colors[4] = f2;
colors[5] = f2+f8;
colors[6] = f2+f4;
colors[7] = f2+f4+f8;
colors[0] = f8;
colors[8] = colors[7];
dxa = dx*a;
dyb = dy*b;
int dx8 = dxa*8;
int dy8 = dyb*8;
int idx1,idx2;
twodxa = 2*dxa;
twodyb = 2*dyb;
pitchb = pitch * b;
if(dxa >= dyb)
{ ckd1 = -(dyb*8);
ckd2 = dxa*8 + ckd1;
int twodyb_dxa = twodyb - twodxa;
pk = twodyb - dxa;
ck = 4*dxa-4*pk;
while(x != x2)
{ x+=a;
if(pk<0)
{ pk+=twodyb;
p += a;
idx1 = ck/dxa;
idx2 = 8 - idx1;
if(fixColor != *p);
{ fixColor = *p;
calColor(ddsd,colors1,fixColor);
}
*p = colors[idx1] + colors1[idx1];
if(fixColor != *(p+pitchb));
{ fixColor = *(p+pitchb);
calColor(ddsd,colors1,fixColor);
}
*(p+pitchb) = colors[idx2] + colors1[idx2];
ck += ckd1;
if(ck < 0)
ck = 0;
}
else
{ pk+=twodyb_dxa;
p += a;
idx1 = ck/dxa;
idx2 = 8 - idx1;
if(fixColor != *p);
{ fixColor = *p;
calColor(ddsd,colors1,fixColor);
}
*p = colors[idx1] + colors1[idx1];
p += pitchb;
if(fixColor != *p);
{ fixColor = *p;
calColor(ddsd,colors1,fixColor);
}
*p = colors[idx2] + colors1[idx2];;
ck += ckd2;
if(ck > dx8)
ck = dx8;
}
}
}
else
{ ckd1 = -(dxa*8);
ckd2 = dyb*8 + ckd1;
pk = twodxa - dyb;
int twodxa_dyb = twodxa - twodyb;
ck = 4*dyb-4*pk;
while(y != y2)
{ y+=b;
if(pk<0)
{ pk+=twodxa;
p += pitchb;
idx1 = ck/dyb;
idx2 = 8 - idx1;
if(fixColor != *p);
{ fixColor = *p;
calColor(ddsd,colors1,fixColor);
}
*p = colors[idx1] + colors1[idx1];
if(fixColor != *(p+a));
{ fixColor = *(p+a);
calColor(ddsd,colors1,fixColor);
}
*(p+a) = colors[idx2] + colors1[idx2];
ck += ckd1;
if(ck < 0)
ck = 0;
}
else
{ pk+=twodxa_dyb;
p += pitchb;
idx1 = ck/dyb;
idx2 = 8 - idx1;
if(fixColor != *p);
{ fixColor = *p;
calColor(ddsd,colors1,fixColor);
}
*p = colors[idx1] + colors1[idx1];
p += a;
if(fixColor != *p);
{ fixColor = *p;
calColor(ddsd,colors1,fixColor);
}
*p = colors[idx2] + colors1[idx2];
ck += ckd2;
if(ck > dy8)
ck = dy8;
}
}
}
}
void circle(DDSURFACEDESC* ddsd,int x,int y,int r,WORD color)
{ int xx,yy,x1,x2,x3,x4,x5,x6,x7,x8,y1,y2,y3,y4,y5,y6,y7,y8,pk;
xx = 0;
yy = r;
x1 = x , y1 = y + r;
x2 = x , y2 = y + r;
x3 = x , y3 = y - r;
x4 = x , y4 = y - r;
x5 = x + r , y5 = y;
x6 = x - r , y6 = y;
x7 = x + r , y7 = y;
x8 = x - r , y8 = y;
pk = 1 - r;
writePixel(ddsd,x1,y1,color);
writePixel(ddsd,x2,y2,color);
writePixel(ddsd,x3,y3,color);
writePixel(ddsd,x4,y4,color);
writePixel(ddsd,x5,y5,color);
writePixel(ddsd,x6,y6,color);
writePixel(ddsd,x7,y7,color);
writePixel(ddsd,x8,y8,color);
while(xx < yy)
{ xx++;
x1++,x2--,x3++,x4--;
y5++,y6++,y7--,y8--;
if(pk < 0)
pk+= 2*xx + 1;
else
{ yy--;
y1--,y2--,y3++,y4++;
x5--,x6++,x7--,x8++;
pk+= 2*(xx - yy) + 1;
}
writePixel(ddsd,x1,y1,color);
writePixel(ddsd,x2,y2,color);
writePixel(ddsd,x3,y3,color);
writePixel(ddsd,x4,y4,color);
writePixel(ddsd,x5,y5,color);
writePixel(ddsd,x6,y6,color);
writePixel(ddsd,x7,y7,color);
writePixel(ddsd,x8,y8,color);
}
}
void circleFill(DDSURFACEDESC* ddsd,int x,int y,int r,WORD color)
{ int xx,yy,x1,x2,x3,x4,x5,x6,x7,x8,y1,y2,y3,y4,y5,y6,y7,y8,pk;
int xx1,xx2,xx3,xx4,xx5,xx6,xx7,xx8;
long width=ddsd->dwWidth-1,height=ddsd->dwHeight-1;
WORD* p=(WORD*)ddsd->lpSurface,*pt;
long pitch = ddsd->lPitch>>1;
xx = 0;
yy = r;
x1 = x , y1 = y + r;
x2 = x , y2 = y + r;
x3 = x , y3 = y - r;
x4 = x , y4 = y - r;
x5 = x + r , y5 = y;
x6 = x - r , y6 = y;
x7 = x + r , y7 = y;
x8 = x - r , y8 = y;
pk = 1 - r;
writePixel(ddsd,x1,y1,color);
writePixel(ddsd,x2,y2,color);
writePixel(ddsd,x3,y3,color);
writePixel(ddsd,x4,y4,color);
xx5 = x5;
xx6 = x6;
if(xx5 >= 0 && x6 <= width)
{ if(xx5 > width)
xx5=xx7= width;
if(xx6 < 0)
xx6=xx8= 0;
if(y5>=0&&y5<=height)
{ pt = p + pitch*y6 + xx6;
*pt = color;
while(xx6<xx5)
{ pt++;
*pt = color;
xx6++;
}
}
}
bool b1,b2;
while(xx < yy)
{ xx++;
x1++,x2--,x3++,x4--;
y5++,y6++,y7--,y8--;
b2 = true;
if(pk < 0)
{ b1 = false;
pk+= 2*xx + 1;
writePixel(ddsd,x1,y1,color);
writePixel(ddsd,x2,y2,color);
writePixel(ddsd,x3,y3,color);
writePixel(ddsd,x4,y4,color);
}
else
{ yy--;
b1 = true;
y1--,y2--,y3++,y4++;
x5--,x6++,x7--,x8++;
pk+= 2*(xx - yy) + 1;
}
xx1=x1,xx2=x2,xx3=x3,xx4=x4,xx5=x5,xx6=x6,xx7=x7,xx8=x8;
if(xx1 < 0)
{ xx1=xx3= 0;
b1 = false;
}
if(xx1 > width)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -