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

📄 wingdi.c

📁 MinGUI 可视化程序代码
💻 C
📖 第 1 页 / 共 5 页
字号:
      { hzkoffset=SYS_FONT_HEIGHT*((SYS_FONT_WIDTH+7)>>3)*ch;
        DrawFontMatrix(dc,PenPosX,PenPosY,SYS_FONT_WIDTH,SYS_FONT_HEIGHT,(BYTE *)&SYS_FONT_ENGLISH[hzkoffset]) ;
        PenPosX=PenPosX+SYS_FONT_WIDTH+colspace;
      }
    }

    ch=*++lptext;
  }

  if(PenPosX>MaxPosX) MaxPosX=PenPosX;
  textwidth=MaxPosX-xPos-colspace;
  GroupOff(dc,xPos,yPos, textwidth,PenPosY+SYS_FONT_HEIGHT-yPos);
  return textwidth;
}
//---------------------------------------------------------------------------
void PrintText(HDC dc, int xPos,int yPos,const char *format, ...)
{  char strBuf[256],*str=strBuf;
   va_list arg_ptr;
   va_start(arg_ptr, format);
   vsprintf(str, format, arg_ptr);
   va_end(arg_ptr);
   TextOut(dc, xPos,yPos,strBuf);
}
//---------------------------------------------------------------------------
/*在指定的剪切区域内显示文字,超出部分自动剪切掉。*/
void  DrawText(HDC dc,int left,int top,int ClipWidth,int ClipHeight,LPCSTR lptext,DWORD Alignment)
{ TSIZE txtsize;
  TRECT oldClip,newClip;
  bool  cliped=false;
  if(!lptext || !*lptext) return;
 
  newClip.left=left;
  newClip.top=top;
  newClip.right=left+ClipWidth;
  newClip.bottom=top+ClipHeight;
  
  if(!RectInRect(&((TWndCanvas *)dc)->ClipRect,&newClip))
  { GetTextSize(dc,lptext,&txtsize);
	if(txtsize.x>ClipWidth || txtsize.y>ClipHeight)
    { oldClip=((TWndCanvas *)dc)->ClipRect;
      if(RectIntersect(&((TWndCanvas *)dc)->ClipRect,&newClip))
	  { cliped=true;
	  } 
	  else
	  { ((TWndCanvas *)dc)->ClipRect=oldClip;
	    return;
	  }
	}
  }
  else
  { if( !(Alignment&alLeft) || !(Alignment&alTop) )
    { GetTextSize(dc,lptext,&txtsize);
    }
  }

  if(!(Alignment&alLeft))
  { if(Alignment&alRight) left-=txtsize.x;
    else left=left+(ClipWidth-txtsize.x)/2;
  }
  if(!(Alignment&alTop))
  { if(Alignment&alBottom) top=top+ClipHeight-txtsize.y;
    else  top=top+(ClipHeight-txtsize.y)/2;
  }
   
  TextOut(dc,left,top,lptext);
 
  if(cliped) /*finally restore the dc-clip area*/
  { ((TWndCanvas *)dc)->ClipRect=oldClip;
  }
}
//---------------------------------------------------------------------------
void GroupOn(HDC dc)
{ if(dc)((TWndCanvas *)dc)->Vram->GroupOperation++;
}
//---------------------------------------------------------------------------
void GroupOff(HDC dc,int x,int y,int width,int height)
{ if(dc)
  { VRAM *Vram=((TWndCanvas *)dc)->Vram;
    if( Vram->GroupOperation >= 2 )
	{  Vram->GroupOperation--;
	   return;
	}
	else
	{ Vram->GroupOperation=0;
	  CHECK_CANVAS_RECT((TWndCanvas *)dc,x,y,width,height);
	  CM_ExposeCanvas((TWndCanvas *)dc,x,y,width,height);
    }
  }
}
//-------------------------------------------------------------------------------------
void CM_ScaleBoxOpt(TWndCanvas *desCanvas, int nXOriginDest,int nYOriginDest,int nWidthDest,int nHeightDest,TWndCanvas *srcCanvas, int nXOriginSrc,int nYOriginSrc,int nWidthSrc,int nHeightSrc,DWORD dwRop)
{ int xfactor = ((DWORD)nWidthSrc<<16)/nWidthDest;        /* scaled by 65536 */
  int yfactor = ((DWORD)nHeightSrc<<16)/nHeightDest;         /* scaled by 65536 */
  PIXEL  *srcLinePos, *desLinePos;
  int  srcBitOffset, desBitOffset;
  
  GetPixelPosition( &srcLinePos, &srcBitOffset, srcCanvas, nXOriginSrc, nYOriginSrc);
  GetPixelPosition( &desLinePos, &desBitOffset, desCanvas, nXOriginDest, nYOriginDest);
 
  #if(BITS_PER_PIXEL==PIXEL_UNIT)  /* 8 16 32 */
  { PIXEL *srcPos=srcLinePos;
    PIXEL *desPos=desLinePos;
    int desUnitPerLine=desCanvas->Vram->UnitPerLine;
    int srcUnitPerLine=srcCanvas->Vram->UnitPerLine;
    int y,sy=0;
    for (y = 0; y < nHeightDest;)
    { int x,sx,syint;
      while(y < nHeightDest)
      { sx=x=0;
        while (x < nWidthDest)
        { PIXEL_SET_LOGIC(desPos + x, *(srcPos + (sx >> 16)), dwRop);
          sx += xfactor;
          x++;
        }
        desPos+=desUnitPerLine;
        y++;
        syint = sy >> 16;
        sy += yfactor;
        if ((sy >> 16) != syint)
          break;
      } 
      srcPos = (PIXEL *)srcLinePos + (sy >> 16) * srcUnitPerLine;
    }
  }
  #elif(BITS_PER_PIXEL==24) 
  { BYTE *srcPos=(BYTE *)srcLinePos;
    BYTE *desPos=(BYTE *)desLinePos;
    int desBytePerLine=desCanvas->Vram->BytePerLine;
    int srcBytePerLine=srcCanvas->Vram->BytePerLine;
    int y, sy=0;
    for (y = 0; y < nHeightDest;)
    { int sx,syint;
      while(y < nHeightDest)
      { BYTE *dp=desPos;
        BYTE *dp_limit=desPos+nWidthDest*3;
        sx=0;
        while (dp < dp_limit)
        { BYTE *sp = srcPos + (sx >> 16)*3;
          SET_3BYTE_LOGIC(dp, *sp, *(sp+1),*(sp+2), dwRop);
          dp+=3;
          sp+=3;
          sx += xfactor;
        }
        desPos+=desBytePerLine;
        y++;
        syint = sy >> 16;
        sy += yfactor;
        if ((sy >> 16) != syint)
          break;
      } 
      srcPos = (BYTE *)srcLinePos + (sy >> 16) * srcBytePerLine;
    }
  }
  #elif(BITS_PER_PIXEL<8)
  { PIXEL *srcPos=srcLinePos;
    PIXEL *desPos=desLinePos;
    int desUnitPerLine=desCanvas->Vram->UnitPerLine;
    int srcUnitPerLine=srcCanvas->Vram->UnitPerLine;
    int y,sy=0;
    for (y = 0; y < nHeightDest;)
    { int x,sx,syint;
      while(y < nHeightDest)
      { PIXEL *sp,*dp=desPos;
        int srcOffset=srcBitOffset,desOffset=desBitOffset;
        sx=x=0;
        while (x < nWidthDest)
        {  PIXEL srcPixel,desMask;
           GetOffsetPixelPosition(&sp, &srcOffset, srcPos, srcBitOffset, (sx >> 16));
           srcPixel=UNIT_GET_BITS(PIXEL_UNIT,*sp,BITS_PER_PIXEL,srcOffset); 
           desMask=(PIXEL)MASK_OFFSET_OPT(BITS_PER_PIXEL,desOffset);
           PIXEL_OFFSET_OPT(srcPixel,BITS_PER_PIXEL,desOffset);
           SET_PIXEL_LOGIC(&srcPixel,*dp,srcPixel,dwRop); //raster option
           *dp=(*dp & ~desMask)|(srcPixel & desMask);
           sx += xfactor;
           x++;
           GetNextPixelPosition(&dp, &desOffset, dp, desOffset);
        }
        desPos+=desUnitPerLine;
        y++;
        syint = sy >> 16;
        sy += yfactor;
        if ((sy >> 16) != syint)
          break;
      } 
      srcPos = (PIXEL *)srcLinePos + (sy >> 16) * srcUnitPerLine;
    }
  }
  #endif
}
//-------------------------------------------------------------------------------------
void CM_ScaleBoxCopy(TWndCanvas *desCanvas, int nXOriginDest,int nYOriginDest,int nWidthDest,int nHeightDest,TWndCanvas *srcCanvas, int nXOriginSrc,int nYOriginSrc,int nWidthSrc,int nHeightSrc)
{ int xfactor = ((DWORD)nWidthSrc<<16)/nWidthDest;        /* scaled by 65536 */
  int yfactor = ((DWORD)nHeightSrc<<16)/nHeightDest;         /* scaled by 65536 */
  PIXEL  *srcLinePos, *desLinePos;
  int  srcBitOffset, desBitOffset;
       
  GetPixelPosition( &srcLinePos, &srcBitOffset, srcCanvas, nXOriginSrc, nYOriginSrc);
  GetPixelPosition( &desLinePos, &desBitOffset, desCanvas, nXOriginDest, nYOriginDest);
 
  #if(BITS_PER_PIXEL==PIXEL_UNIT)  /* 8 16 32 */
  { PIXEL *srcPos=srcLinePos;
    PIXEL *desPos=desLinePos;
    int desUnitPerLine=desCanvas->Vram->UnitPerLine;
    int srcUnitPerLine=srcCanvas->Vram->UnitPerLine;
    int desAreaLineBytes=nWidthDest*UNIT_BYTE;
    int y, sy=0;
    for (y = 0; y < nHeightDest;)
    { int x=0,sx = 0;
      PIXEL *desPosOld = desPos;
      while (x < nWidthDest)
      { *(desPos + x) =  *(srcPos + (sx >> 16) );
        sx += xfactor;
        x++;
      }
      desPos+=desUnitPerLine;
      y++;
      while (y < nHeightDest) 
      { int syint = sy >> 16;
        sy += yfactor;
        if ((sy >> 16) != syint)
           break;
        /* Copy identical lines. */
        memcpy(desPos, desPosOld, desAreaLineBytes);
     
        desPos += desUnitPerLine;
        y++;
      }
      srcPos = (PIXEL *)srcLinePos + (sy >> 16) * srcUnitPerLine;
    }
  }
  #elif(BITS_PER_PIXEL==24) 
  { BYTE *srcPos=(BYTE *)srcLinePos;
    BYTE *desPos=(BYTE *)desLinePos;
    int desAreaLineBytes=nWidthDest*3;
    int y, sy=0;
    for (y = 0; y < nHeightDest;)
    { int x=0,sx = 0;
      BYTE *desPosOld = desPos;
      while (x < nWidthDest)
      { BYTE *dp=desPos + x*3;
        BYTE *sp=srcPos + (sx >> 16)*3;
        *dp =  *sp;
        *(dp+1)=*(sp+1);
        *(dp+2)=*(sp+2);
        sx += xfactor;
        x++;
      }
      desPos+=desCanvas->Vram->BytePerLine;
      y++;
      while (y < nHeightDest) 
      { int syint = sy >> 16;
        sy += yfactor;
        if ((sy >> 16) != syint)
          break;
        /* Copy identical lines. */
        memcpy(desPos, desPosOld, desAreaLineBytes);
            
        desPos += desCanvas->Vram->BytePerLine;
        y++;
      }
      srcPos = (BYTE *)srcLinePos + (sy >> 16) * srcCanvas->Vram->BytePerLine;
    }
  }
  #elif(BITS_PER_PIXEL<8)
  { PIXEL *srcPos=srcLinePos;
    PIXEL *desPos=desLinePos;
    int desUnitPerLine=desCanvas->Vram->UnitPerLine;
    int srcUnitPerLine=srcCanvas->Vram->UnitPerLine;
    int y,sy=0;
    for (y = 0; y < nHeightDest;)
    { int x,sx,syint;
      while(y < nHeightDest)
      { PIXEL *sp,*dp=desPos;
        int srcOffset=srcBitOffset,desOffset=desBitOffset;
        sx=x=0;
        while (x < nWidthDest)
        {  PIXEL srcPixel,desMask;
           GetOffsetPixelPosition(&sp, &srcOffset, srcPos, srcBitOffset, (sx >> 16));
           srcPixel=UNIT_GET_BITS(PIXEL_UNIT,*sp,BITS_PER_PIXEL,srcOffset); 
           desMask=(PIXEL)MASK_OFFSET_OPT(BITS_PER_PIXEL,desOffset);
           PIXEL_OFFSET_OPT(srcPixel,BITS_PER_PIXEL,desOffset);
           *dp=(*dp & ~desMask)| srcPixel;
           sx += xfactor;
           x++;
           GetNextPixelPosition(&dp, &desOffset, dp, desOffset);
        }
        desPos+=desUnitPerLine;
        y++;
        syint = sy >> 16;
        sy += yfactor;
        if ((sy >> 16) != syint)
          break;
      } 
      srcPos = (PIXEL *)srcLinePos + (sy >> 16) * srcUnitPerLine;
    }
  }
  #endif
}
//-------------------------------------------------------------------------------------
void CM_ScaleBoxFilterOpt(TWndCanvas *desCanvas, int nXOriginDest,int nYOriginDest,int nWidthDest,int nHeightDest,TWndCanvas *srcCanvas, int nXOriginSrc,int nYOriginSrc,int nWidthSrc,int nHeightSrc,DWORD dwRop)
{ int xfactor = ((DWORD)nWidthSrc<<16)/nWidthDest;        /* scaled by 65536 */
  int yfactor = ((DWORD)nHeightSrc<<16)/nHeightDest;         /* scaled by 65536 */
  PIXEL  *srcLinePos, *desLinePos;
  int  srcBitOffset, desBitOffset;
  PIXEL transparentPixel=srcCanvas->Background;
  GetPixelPosition( &srcLinePos, &srcBitOffset, srcCanvas, nXOriginSrc, nYOriginSrc);
  GetPixelPosition( &desLinePos, &desBitOffset, desCanvas, nXOriginDest, nYOriginDest);
 
  #if(BITS_PER_PIXEL==PIXEL_UNIT)  /* 8 16 32 */
  { PIXEL *srcPos=srcLinePos;
    PIXEL *desPos=desLinePos;
    int desUnitPerLine=desCanvas->Vram->UnitPerLine;
    int srcUnitPerLine=srcCanvas->Vram->UnitPerLine;
    int y,sy=0;
    for (y = 0; y < nHeightDest;)
    { int x,sx,syint;
      while(y < nHeightDest)
      { sx=x=0;
        while (x < nWidthDest)
        { PIXEL srcPixel=*(srcPos + (sx >> 16));
          if(srcPixel!=transparentPixel)
            PIXEL_SET_LOGIC(desPos + x, srcPixel, dwRop);
          sx += xfactor;
          x++;
        }
        desPos+=desUnitPerLine;
        y++;
        syint = sy >> 16;
        sy += yfactor;
        if ((sy >> 16) != syint)
          break;
      } 
      srcPos = (PIXEL *)srcLinePos + (sy >> 16) * srcUnitPerLine;
    }
  }
  #elif(BITS_PER_PIXEL==24) 
  { BYTE *srcPos=(BYTE *)srcLinePos;
    BYTE *desPos=(BYTE *)desLinePos;
    int desBytePerLine=desCanvas->Vram->BytePerLine;
    int srcBytePerLine=srcCanvas->Vram->BytePerLine;
	BYTE filter_1=(BYTE)transparentPixel;
    BYTE filter_2=(BYTE)(transparentPixel>>8);
    BYTE filter_3=(BYTE)(transparentPixel>>16);
    BYTE srcByte_1,srcByte_2,srcByte_3;
    int y, sy=0;
    for (y = 0; y < nHeightDest;)
    { int sx,syint;
      while(y < nHeightDest)
      { BYTE *dp=desPos;
        BYTE *dp_limit=desPos+nWidthDest*3;
        sx=0;
        while (dp < dp_limit)
        { BYTE *sp = srcPos + (sx >> 16)*3;
		  srcByte_1=*sp++;
          srcByte_2=*sp++;
          srcByte_3=*sp++;
		  if(srcByte_1!=filter_1 || srcByte_2!=filter_2 || srcByte_3!=filter_3)
		  { SET_3BYTE_LOGIC(dp, srcByte_1, srcByte_2,srcByte_3, dwRop);
 		  }
          dp+=3;
          sx += xfactor;
        }
        desPos+=desBytePerLine;
        y++;
        syint = sy >> 16;
        sy += yfactor;
        if ((sy >> 16) != syint)
          break;
      } 
  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -