📄 wingdi.c
字号:
void FillRect(HDC dc,int left,int top,int width,int height)
{ if(dc)
{ VRAM *vram=((TWndCanvas *)dc)->Vram;
PIXEL *PixelPos,*StartPos;
PIXEL FillColorIndex;
int HeadBitOffset;
int i,j;
DWORD dwRop=((TWndCanvas *)dc)->Mode&0x03;
CHECK_CANVAS_RECT((TWndCanvas *)dc,left,top,width,height);
GetPixelPosition( &StartPos, &HeadBitOffset, (TWndCanvas *)dc, left, top);
FillColorIndex=((TWndCanvas *)dc)->Foreground;
#if(BITS_PER_PIXEL==PIXEL_UNIT) /* 8 16 32 */
{ for(j=0;j<height;j++)
{ PixelPos=StartPos;
StartPos=GetNextLinePos(StartPos, vram );
for(i=0;i<width;i++)
{ SET_PIXEL_LOGIC(PixelPos,*PixelPos,FillColorIndex,dwRop);
PixelPos++;
}
}
}
#elif(BITS_PER_PIXEL==24)
{ BYTE FillColorByte1=(BYTE)FillColorIndex;
BYTE FillColorByte2=(BYTE)(FillColorIndex>>8);
BYTE FillColorByte3=(BYTE)(FillColorIndex>>16);
for(j=0;j<height;j++)
{ PixelPos=StartPos;
StartPos=GetNextLinePos(StartPos, vram );
for(i=0;i<width;i++)
{ SET_3BYTE_LOGIC(PixelPos,FillColorByte1,FillColorByte2,FillColorByte3,dwRop);
PixelPos=(PIXEL *)((BYTE *)PixelPos+3);
}
}
}
#elif(BITS_PER_PIXEL<8)
{ int totalBits,UnitCount;
PIXEL headbitmask,tailbitmask,b_headbitmask,b_tailbitmask,newpixel;
if(FillColorIndex!=0)
{ PIXEL Foreground=FillColorIndex;
for(i=BITS_PER_PIXEL;i<PIXEL_UNIT;i+=BITS_PER_PIXEL)
{ FillColorIndex=(FillColorIndex<<BITS_PER_PIXEL)|Foreground;
}
}
totalBits=width<<LOG_PIXEL_BITS;
if(HeadBitOffset)
{ if(totalBits<PIXEL_UNIT-HeadBitOffset)
{ headbitmask=MASK_OFFSET_OPT(totalBits,HeadBitOffset);
UnitCount=0;
tailbitmask=0;
}
else
{ int headbitcount=PIXEL_UNIT-HeadBitOffset;
int otherbits=totalBits-headbitcount;
headbitmask=MASK_OFFSET_OPT(headbitcount,HeadBitOffset);
UnitCount=otherbits/PIXEL_UNIT;
tailbitmask=otherbits%PIXEL_UNIT;
if(tailbitmask)
{ tailbitmask=MASK_OFFSET_OPT(tailbitmask,0);
}
}
}
else
{ UnitCount= totalBits/PIXEL_UNIT;
tailbitmask=MASK_OFFSET_OPT((totalBits%PIXEL_UNIT),0);
}
b_headbitmask=~headbitmask;
b_tailbitmask=~tailbitmask;
for(j=0;j<height;j++)
{ PixelPos=StartPos;
StartPos=GetNextLinePos(StartPos, vram );
if(HeadBitOffset)
{ SET_PIXEL_LOGIC(&newpixel,*PixelPos,FillColorIndex,dwRop);
*PixelPos++=(*PixelPos & b_headbitmask) | (newpixel & headbitmask);;
}
if(UnitCount)
{ for(i=0;i<UnitCount;i++)
{ SET_PIXEL_LOGIC(PixelPos,*PixelPos,FillColorIndex,dwRop);
PixelPos++;
}
}
if(tailbitmask)
{ SET_PIXEL_LOGIC(&newpixel,*PixelPos,FillColorIndex,dwRop);
*PixelPos=( *PixelPos & b_tailbitmask ) | ( newpixel & tailbitmask );
}
}
}
#endif
CM_ExposeCanvas( (TWndCanvas *)dc,left,top,width,height);
}
}
//---------------------------------------------------------------------------
void ClearRect(HDC dc,int left,int top,int width,int height)
{ if(dc)
{ VRAM *vram=((TWndCanvas *)dc)->Vram;
int i,j;
PIXEL FillColorIndex;
PIXEL *PixelPos,*StartPos;
int HeadBitOffset;
CHECK_CANVAS_RECT((TWndCanvas *)dc,left,top,width,height);
GetPixelPosition( &StartPos, &HeadBitOffset, (TWndCanvas *)dc,left, top);
FillColorIndex=((TWndCanvas *)dc)->Background;
#if(BITS_PER_PIXEL==PIXEL_UNIT) /* 8 16 32 */
{ for(j=0;j<height;j++)
{ PixelPos=StartPos;
StartPos=GetNextLinePos(StartPos, vram );
for(i=0;i<width;i++)
{ *PixelPos++=FillColorIndex;
}
}
}
#elif(BITS_PER_PIXEL==24)
{ BYTE FillColorByte1=(BYTE)FillColorIndex;
BYTE FillColorByte2=(BYTE)(FillColorIndex>>8);
BYTE FillColorByte3=(BYTE)(FillColorIndex>>16);
for(j=0;j<height;j++)
{ PixelPos=StartPos;
StartPos=GetNextLinePos(StartPos, vram );
for(i=0;i<width;i++)
{ *(BYTE *)PixelPos=FillColorByte1;
PixelPos=(PIXEL *)((BYTE *)PixelPos + 1);
*(BYTE *)PixelPos=FillColorByte2;
PixelPos=(PIXEL *)((BYTE *)PixelPos + 1);
*(BYTE *)PixelPos=FillColorByte3;
PixelPos=(PIXEL *)((BYTE *)PixelPos + 1);
}
}
}
#elif(BITS_PER_PIXEL<8)
{ int totalBits,UnitCount;
PIXEL headbitmask,tailbitmask,b_headbitmask,b_tailbitmask;
if(FillColorIndex!=0)
{ PIXEL Foreground=FillColorIndex;
for(i=BITS_PER_PIXEL;i<PIXEL_UNIT;i+=BITS_PER_PIXEL)
{ FillColorIndex=(FillColorIndex<<BITS_PER_PIXEL)|Foreground;
}
}
totalBits=width<<LOG_PIXEL_BITS;
if(HeadBitOffset)
{ if(totalBits<PIXEL_UNIT-HeadBitOffset)
{ headbitmask=MASK_OFFSET_OPT(totalBits,HeadBitOffset);
UnitCount=0;
tailbitmask=0;
}
else
{ int headbitcount=PIXEL_UNIT-HeadBitOffset;
int otherbits=totalBits-headbitcount;
headbitmask=MASK_OFFSET_OPT(headbitcount,HeadBitOffset);
UnitCount=otherbits/PIXEL_UNIT;
tailbitmask=otherbits%PIXEL_UNIT;
if(tailbitmask)
{ tailbitmask=MASK_OFFSET_OPT(tailbitmask,0);
}
}
}
else
{ UnitCount= totalBits/PIXEL_UNIT;
tailbitmask=MASK_OFFSET_OPT((totalBits%PIXEL_UNIT),0);
}
b_headbitmask=~headbitmask;
b_tailbitmask=~tailbitmask;
for(j=0;j<height;j++)
{ PixelPos=StartPos;
StartPos=GetNextLinePos(StartPos, vram );
if(HeadBitOffset)
{ *PixelPos++=(*PixelPos & b_headbitmask) | (FillColorIndex & headbitmask);;
}
if(UnitCount)
{ for(i=0;i<UnitCount;i++)
{ *PixelPos++=FillColorIndex;
}
}
if(tailbitmask)
{ *PixelPos=( *PixelPos & b_tailbitmask ) | ( FillColorIndex & tailbitmask );
}
}
}
#endif
CM_ExposeCanvas((TWndCanvas *)dc,left,top,width,height);
}
}
//---------------------------------------------------------------------------
void DrawEllipse(HDC dc, int x, int y, int a, int b)
{ int x0=0;
int y0 = b;
int a0 = a;
int b0 = b;
int asqr = a0 * a0;
int two_asqr = asqr<<1;
int bsqr = b0 * b0;
int two_bsqr = bsqr<<1;
int d, dx, dy;
int BitOffset;
PIXEL *PixelPos;
d = bsqr - asqr * b0 + (asqr >> 2);
dx = 0;
dy = (long)two_asqr * b0;
do
{ PUT_PIXEL((TWndCanvas *)dc,x+x0, y+y0 );
PUT_PIXEL((TWndCanvas *)dc, x-x0, y+y0 );
PUT_PIXEL((TWndCanvas *)dc,x+x0, y-y0 );
PUT_PIXEL((TWndCanvas *)dc,x-x0, y-y0 );
if ( d > 0 )
{ y0--;
dy -= two_asqr;
d -= dy;
}
x0++;
dx += two_bsqr;
d += (bsqr+dx);
}while ( dx < dy );
d += (3*(asqr-bsqr)/2 - (dx+dy))/2;
do
{ PUT_PIXEL((TWndCanvas *)dc,x+x0, y+y0 );
PUT_PIXEL((TWndCanvas *)dc,x-x0, y+y0 );
PUT_PIXEL((TWndCanvas *)dc, x+x0, y-y0 );
PUT_PIXEL((TWndCanvas *)dc, x-x0, y-y0 );
if ( d < 0 )
{ x0++;
dx += two_bsqr;
d += dx;
}
y0--;
dy -= two_asqr;
d += (asqr-dy);
} while (y0>=0);
}
//---------------------------------------------------------------------------
void DrawCircle(HDC dc, int xCenter, int yCenter, int radius)
{ int x, y, d;
int BitOffset;
PIXEL *PixelPos;
if(radius<=0)return;
x = xCenter;
y = yCenter + radius;
d = 3 - 2 * radius;
do
{ PUT_PIXEL((TWndCanvas *)dc, x, y );
PUT_PIXEL((TWndCanvas *)dc,x, yCenter - (y - yCenter) );
PUT_PIXEL((TWndCanvas *)dc, xCenter - (x - xCenter), y );
PUT_PIXEL((TWndCanvas *)dc, xCenter - (x - xCenter), yCenter - (y - yCenter) );
PUT_PIXEL((TWndCanvas *)dc,xCenter + (y - yCenter), yCenter + (x - xCenter ) );
PUT_PIXEL((TWndCanvas *)dc,xCenter + (y - yCenter), yCenter - (x - xCenter) );
PUT_PIXEL((TWndCanvas *)dc, xCenter - (y - yCenter), yCenter + (x - xCenter ) );
PUT_PIXEL((TWndCanvas *)dc, xCenter - (y - yCenter), yCenter - (x - xCenter) );
if ( d < 0 )
{ d = d + ((x - xCenter) << 2) + 6;
}
else
{ d = d + (((x - xCenter) - (y - yCenter)) << 2 ) + 10;
y--;
}
x++;
}
while ( (x - xCenter) < (y - yCenter) );
PUT_PIXEL((TWndCanvas *)dc,(xCenter + (y - yCenter)), (yCenter + (x - xCenter )) );
PUT_PIXEL((TWndCanvas *)dc, (xCenter + (y - yCenter)), (yCenter - (x - xCenter)) );
PUT_PIXEL((TWndCanvas *)dc,(xCenter - (y - yCenter)), (yCenter + (x - xCenter )) );
PUT_PIXEL((TWndCanvas *)dc,(xCenter - (y - yCenter)), (yCenter - (x - xCenter)) );
}
//---------------------------------------------------------------------------
void DrawSector(HDC dc, int xCenter, int yCenter, int radius,int angle1,int angle2)
{ int x, y, d,c1,c2,c,step=0;
int BitOffset,quarter1,quarter2,quarter3,quarter4;
PIXEL *PixelPos;
if(radius<=0)return;
x = xCenter;
y = yCenter + radius;
d = 3 - 2 * radius;
c1=(int)(angle1*radius*3.14159/180);
c2=(int)(angle2*radius*3.14159/180);
quarter1=(int)(radius*3.14159/2);
quarter2=(int)(radius*3.14159);
quarter3=(int)(radius*3.14159*3/2);
quarter4=(int)(radius*3.14159*2);
while(1)
{ c=quarter4-step;
if(c>=c1 && c<=c2) PUT_PIXEL((TWndCanvas *)dc,xCenter + (y - yCenter), yCenter + (x - xCenter ) );
if(step>=c1 && step<=c2) PUT_PIXEL((TWndCanvas *)dc,xCenter + (y - yCenter), yCenter - (x - xCenter) );
c=quarter2+step;
if(c>=c1 && c<=c2) PUT_PIXEL((TWndCanvas *)dc, xCenter - (y - yCenter), yCenter + (x - xCenter ) );
c=quarter2-step;
if(c>=c1 && c<=c2) PUT_PIXEL((TWndCanvas *)dc, xCenter - (y - yCenter), yCenter - (x - xCenter) );
if ( x - xCenter >= y - yCenter ) break;
c=quarter3+step;
if(c>=c1 && c<=c2) PUT_PIXEL((TWndCanvas *)dc, x, y );
c=quarter1-step;
if(c>=c1 && c<=c2) PUT_PIXEL((TWndCanvas *)dc,x, yCenter - (y - yCenter) );
c=quarter3-step;
if(c>=c1 && c<=c2) PUT_PIXEL((TWndCanvas *)dc, xCenter - (x - xCenter), y );
c= quarter1+step;
if(c>=c1 && c<=c2) PUT_PIXEL((TWndCanvas *)dc, xCenter - (x - xCenter), yCenter - (y - yCenter) );
if ( d < 0 )
{ d = d + ((x - xCenter) << 2) + 6;
}
else
{ d = d + (((x - xCenter) - (y - yCenter)) << 2 ) + 10;
y--;
}
x++;
step++;
}
}
//---------------------------------------------------------------------------
/*the arithmetic of FillSector if not very well,it should to be optimized later*/
void FillSector(HDC dc, int xCenter, int yCenter, int radius,int angle1,int angle2)
{ int x, y, d,c1,c2,c,step=0;
int quarter1,quarter2,quarter3,quarter4;
if(radius<=0)return;
x = xCenter;
y = yCenter + radius;
d = 3 - 2 * radius;
c1=(int)(angle1*radius*3.14159/180);
c2=(int)(angle2*radius*3.14159/180);
quarter1=(int)(radius*3.14159/2);
quarter2=(int)(radius*3.14159);
quarter3=(int)(radius*3.14159*3/2);
quarter4=(int)(radius*3.14159*2);
while(1)
{ c=quarter4-step;
if(c>=c1 && c<=c2) DrawLine((TWndCanvas *)dc,xCenter + (y - yCenter), yCenter + (x - xCenter ) ,xCenter,yCenter );
if(step>=c1 && step<=c2) DrawLine((TWndCanvas *)dc,xCenter + (y - yCenter), yCenter - (x - xCenter),xCenter,yCenter );
c=quarter2+step;
if(c>=c1 && c<=c2) DrawLine((TWndCanvas *)dc, xCenter - (y - yCenter), yCenter + (x - xCenter ),xCenter,yCenter );
c=quarter2-step;
if(c>=c1 && c<=c2) DrawLine((TWndCanvas *)dc, xCenter - (y - yCenter), yCenter - (x - xCenter),xCenter,yCenter);
if ( x - xCenter >= y - yCenter ) break;
c=quarter3+step;
if(c>=c1 && c<=c2) DrawLine((TWndCanvas *)dc, x, y,xCenter,yCenter );
c=quarter1-step;
if(c>=c1 && c<=c2) DrawLine((TWndCanvas *)dc,x, yCenter - (y - yCenter),xCenter,yCenter );
c=quarter3-step;
if(c>=c1 && c<=c2) DrawLine((TWndCanvas *)dc, xCenter - (x - xCenter), y ,xCenter,yCenter);
c= quarter1+step;
if(c>=c1 && c<=c2) DrawLine((TWndCanvas *)dc, xCenter - (x - xCenter), yCenter - (y - yCenter) ,xCenter,yCenter);
if ( d < 0 )
{ d = d + ((x - xCenter) << 2) + 6;
}
else
{ d = d + (((x - xCenter) - (y - yCenter)) << 2 ) + 10;
y--;
}
x++;
step++;
}
}
//---------------------------------------------------------------------------
void FillEllipse(HDC dc, int x, int y, int a, int b)
{ int x0=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -