📄 wingdi.c
字号:
{ 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 + -