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

📄 wingdi.c

📁 MinGUI 可视化程序代码
💻 C
📖 第 1 页 / 共 5 页
字号:
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 + -