📄 rop2.cpp
字号:
#include "gos.h"
#include "rop2.h"
const WORD CROP4::m_aColor16[16]=
{
0x0000,0x8000,0x0400,0x8400,0x0010,0x8010,0x0410,0xc618,
0x8410,0xf800,0x07e0,0xffe0,0x001f,0xf81f,0x07ff,0xffff,
};
const DWORD CROP4::m_aColor32[16]=
{
0x00000000,0x80800000,0x10008000,0x90808000,
0x02000080,0x82800080,0x12008080,0xdbc0c0c0,
0x92808080,0xe0ff0000,0x1c00ff00,0xfcffff00,
0x030000ff,0xe3ff00ff,0x1f00ffff,0xffffffff,
};
void CROP::SelectObject(CBitmap* pBitmap)
{
const BITMAP &bmp=pBitmap->GetBitmap();
int y,x=bmp.bmBitsPixel;
PBYTE pBits=PBYTE(bmp.bmBits);
switch(x)
{
case 1:GetProc=CROP1::GetProc;break;
case 4:GetProc=CROP4::GetProc;break;
case 8:GetProc=CROP8::GetProc;break;
case 16:GetProc=CROP16::GetProc;break;
default:GetProc=CROP24::GetProc;
}
GETBMPWIDTHBYTES(y,bmp.bmWidth,x);
if(bmp.bmWidth<0)
{
x=-x;
pBits+=(x*(bmp.bmWidth+1))/8;
}
if(bmp.bmHeight<0)
{
y=-y;
pBits+=y*(bmp.bmHeight+1);
}
if(bmp.bmBitsPixel<8)y*=8;
else x/=8;
m_nStepX=x;
m_nStepY=y;
m_pBits=pBits;
}
void CROP::SetRopGetColor(CDC* pDestDC,CBitmap* pSrcBmp)
{
DWORD nROP;
c=DWORD(&pDestDC->GetRopObj().c);
if(pSrcBmp->GetBitmap().bmBitsPixel<=8 && pDestDC->GetCurrentPalette())
{
i=DWORD(pDestDC->GetCurrentPalette()->GetTable());
if(i>0)
{
SetROP(R2_GETCOLORINDEX);
return;
}
}
switch(pDestDC->GetCurrentBitmap()->GetBitmap().bmBitsPixel)
{
case 16:
if(pSrcBmp->GetBitmap().bmType&BMP_TYPEMASK)
{
ROP=Color555To565;
return;
}
nROP=R2_GETCOLOR16;
break;
case 8:
nROP=R2_GETCOLOR8;
break;
case 4:
nROP=R2_GETCOLOR4;
break;
case 1:
nROP=R2_GETCOLOR1;
break;
default:
nROP=R2_GETCOLOR24;
break;
}
SetROP(nROP);
}
void CROP::RpNone(CROP &rp)
{
/* 无操作 */
}
void CROP::RpIfPen(CROP &rp)
{
if(rp.c==rp.i)rp.ROP(rp);
}
void CROP::RpIfNotPen(CROP &rp)
{
if(rp.c!=rp.i)rp.ROP(rp);
}
void CROP::Color555To565(CROP &rp)
{
DWORD clr,c=*PWORD(rp.p);
clr=(c&0x07FE0)<<1;
clr|=(c>>4)&0x20;
*PDWORD(rp.c)=clr|(c&0x001F);
}
void CROP::Color32To24(CROP &rp)
{
PBYTE p=PBYTE(rp.p);
DWORD c=p[0];
c|=DWORD(p[1])<<16;
c|=DWORD(p[2])<<24;
*PDWORD(rp.c)=c;
}
//24位ROP渲染
void CROP24::CopyPen(CROP &rp)
{
PBYTE p=PBYTE(rp.p);DWORD c=rp.c;
p[0]=BYTE(c);p[1]=BYTE(c>>8);p[2]=BYTE(c>>16);
}
void CROP24::XorPen(CROP &rp)
{
PBYTE p=PBYTE(rp.p);DWORD c=rp.c;
p[0]^=BYTE(c);p[1]^=BYTE(c>>8);p[2]^=BYTE(c>>16);
}
void CROP24::AndPen(CROP &rp)
{
PBYTE p=PBYTE(rp.p);DWORD c=rp.c;
p[0]&=BYTE(c);p[1]&=BYTE(c>>8);p[2]&=BYTE(c>>16);
}
void CROP24::AndNotPen(CROP &rp)
{
PBYTE p=PBYTE(rp.p);DWORD c=~rp.c;
p[0]&=BYTE(c);p[1]&=BYTE(c>>8);p[2]&=BYTE(c>>16);
}
void CROP24::AndPenNot(CROP &rp)
{
PBYTE p=PBYTE(rp.p);DWORD c=rp.c;
p[0]=~p[0]&BYTE(c);p[1]=~p[1]&BYTE(c>>8);p[2]=~p[2]&BYTE(c>>16);
}
void CROP24::OrPen(CROP &rp)
{
PBYTE p=PBYTE(rp.p);DWORD c=rp.c;
p[0]|=BYTE(c);p[1]|=BYTE(c>>8);p[2]|=BYTE(c>>16);
}
void CROP24::OrNotPen(CROP &rp)
{
PBYTE p=PBYTE(rp.p);DWORD c=~rp.c;
p[0]|=BYTE(c);p[1]|=BYTE(c>>8);p[2]|=BYTE(c>>16);
}
void CROP24::OrPenNot(CROP &rp)
{
PBYTE p=PBYTE(rp.p);DWORD c=rp.c;
p[0]=~p[0]|BYTE(c);p[1]=~p[1]|BYTE(c>>8);p[2]=~p[2]|BYTE(c>>16);
}
void CROP24::NotCopyPen(CROP &rp)
{
PBYTE p=PBYTE(rp.p);DWORD c=~rp.c;
p[0]=BYTE(c);p[1]=BYTE(c>>8);p[2]=BYTE(c>>16);
}
void CROP24::NotAndPen(CROP &rp)
{
PBYTE p=PBYTE(rp.p);DWORD c=rp.c;
p[0]&=BYTE(c);p[0]=~p[0];
c>>=8;p[1]&=BYTE(c);p[1]=~p[1];
c>>=8;p[2]&=BYTE(c);p[2]=~p[2];
}
void CROP24::NotOrPen(CROP &rp)
{
PBYTE p=PBYTE(rp.p);DWORD c=rp.c;
p[0]|=BYTE(c);p[0]=~p[0];
c>>=8;p[1]|=BYTE(c);p[1]=~p[1];
c>>=8;p[2]|=BYTE(c);p[2]=~p[2];
}
void CROP24::NotXorPen(CROP &rp)
{
PBYTE p=PBYTE(rp.p);DWORD c=rp.c;
p[0]^=BYTE(c);p[0]=~p[0];
c>>=8;p[1]^=BYTE(c);p[1]=~p[1];
c>>=8;p[2]^=BYTE(c);p[2]=~p[2];
}
void CROP24::AlphaBlend(CROP &rp)
{
PBYTE p=PBYTE(rp.p);
DWORD r,g,b,c=rp.c,clr=rp.a;
r=(c>>16)&0xff;g=(c>>8)&0xff;b=c&0xff;
c=256-clr;
r*=c;r+=127;
g*=c;g+=127;
b*=c;b+=127;
c=p[2]*clr+r;p[2]=BYTE(c>>8);
c=p[1]*clr+g;p[1]=BYTE(c>>8);
c=p[0]*clr+b;p[0]=BYTE(c>>8);
}
void CROP24::AlphaPen(CROP &rp)
{
PBYTE p=PBYTE(rp.p);
DWORD c,clr=rp.a;
c=p[2]*clr+rp.r;p[2]=BYTE(c>>8);
c=p[1]*clr+rp.g;p[1]=BYTE(c>>8);
c=p[0]*clr+rp.b;p[0]=BYTE(c>>8);
}
void CROP24::AlphaBlendPen(CROP &rp)
{
CopyPen(rp);
AlphaPen(rp);
}
//24位设备的像素操作
void CROP24::GetColorIndex(CROP &rp)
{
PDWORD aColor=PDWORD(rp.i);
PBYTE p=PBYTE(rp.p);
DWORD c=p[0];
c|=DWORD(p[1])<<16;
c|=DWORD(p[2])<<24;
*PDWORD(rp.c)=aColor[c];
}
void CROP24::GetColor1(CROP &rp)
{
PBYTE p=PBYTE(rp.p);
DWORD c;
c=p[2];c|=p[1];c|=p[0];
*PDWORD(rp.c)=c?1:0;
}
void CROP24::GetColor4(CROP &rp)
{
PBYTE p=PBYTE(rp.p);
DWORD r=p[2],g=p[1],b=p[0],h;
h=r|g|b;h>>=4;h&=8;
r>>=6;r|=r>>1;r&=1;
g>>=5;g|=g>>1;g&=2;
b>>=4;b|=b>>1;b&=4;
*PDWORD(rp.c)=r|g|b|h;
}
void CROP24::GetColor8(CROP &rp)
{
PBYTE p=PBYTE(rp.p);
DWORD r,g,b;
r=p[2];r&=0xe0;
g=p[1];g>>=5;g<<=2;
b=p[0];b>>=6;
*PDWORD(rp.c)=r|g|b;
}
void CROP24::GetColor16(CROP &rp)
{
PBYTE p=PBYTE(rp.p);
DWORD r,g,b;
r=p[2];r>>=3;r<<=11;
g=p[1];g>>=2;g<<=5;
b=p[0];b>>=3;
*PDWORD(rp.c)=r|g|b;
}
void CROP24::GetColor24(CROP &rp)
{
PBYTE p=PBYTE(rp.p);
DWORD c=p[0];
c|=DWORD(p[1])<<16;
c|=DWORD(p[2])<<24;
*PDWORD(rp.c)=c;
}
void CROP24::RpIfScr(CROP &rp)
{
PBYTE p=PBYTE(rp.p);
DWORD r,g,b=p[0];
r=p[2];r<<=16;
g=p[1];g<<=8;
if((r|g|b)==rp.i)rp.ROP(rp);
}
void CROP24::RpIfNotScr(CROP &rp)
{
PBYTE p=PBYTE(rp.p);
DWORD r,g,b=p[0];
r=p[2];r<<=16;
g=p[1];g<<=8;
if((r|g|b)!=rp.i)rp.ROP(rp);
}
PFNROP CROP24::GetProc(int nRop)
{
PFNROP pProc;
switch(nRop)
{
case R2_COPYPEN:pProc=CopyPen;break;
case R2_PRVRPIFSCR:pProc=RpIfScr;break;
case R2_PRVRPIFNOTSCR:pProc=RpIfNotScr;break;
case R2_PRVRPIFPEN:pProc=RpIfPen;break;
case R2_PRVRPIFNOTPEN:pProc=RpIfNotPen;break;
case R2_XORPEN:pProc=XorPen;break;
case R2_MASKPEN:pProc=AndPen;break;
case R2_MASKNOTPEN:pProc=AndNotPen;break;
case R2_MASKPENNOT:pProc=AndPenNot;break;
case R2_MERGEPEN:pProc=OrPen;break;
case R2_MERGENOTPEN:pProc=OrNotPen;break;
case R2_MERGEPENNOT:pProc=OrPenNot;break;
case R2_NOTCOPYPEN:pProc=NotCopyPen;break;
case R2_NOTMASKPEN:pProc=NotAndPen;break;
case R2_NOTMERGEPEN:pProc=NotOrPen;break;
case R2_NOTXORPEN:pProc=NotXorPen;break;
case R2_ALPHAPEN:pProc=AlphaPen;break;
case R2_ALPHABLEND:pProc=AlphaBlend;break;
case R2_ALPHABLENDPEN:pProc=AlphaBlendPen;break;
case R2_GETCOLORINDEX:pProc=GetColorIndex;break;
case R2_GETCOLOR1:pProc=GetColor1;break;
case R2_GETCOLOR4:pProc=GetColor4;break;
case R2_GETCOLOR8:pProc=GetColor8;break;
case R2_GETCOLOR16:pProc=GetColor16;break;
case R2_GETCOLOR24:pProc=GetColor24;break;
case R2_SETPENCOLOR:pProc=SetPenColor;break;
case R2_COPYPALETTE:pProc=CopyPalette;break;
default:
pProc=RpNone;break;
}
return pProc;
}
void CROP24::SetPenColor(CROP &rp)
{
DWORD c=rp.c;
rp.r=(c&0xff);
rp.g=(c>>8)&0xff;
rp.b=(c>>16)&0xff;
rp.c=(rp.r<<16)|(rp.g<<8)|(rp.b);
if(c & 0xff000000)
{
c>>=24;rp.a=c;c=256-c;
rp.r*=c;rp.r+=127;
rp.g*=c;rp.g+=127;
rp.b*=c;rp.b+=127;
}
else rp.a=0;
}
void CROP24::CopyPalette(CROP &rp)
{
int nCount=rp.c;
PBYTE pSrc=PBYTE(rp.a);
PBYTE pDest=PBYTE(rp.i);
if(nCount<0)
{
while(nCount++)
{
pDest[0]=pSrc[2];
pDest[1]=pSrc[1];
pDest[2]=pSrc[0];
pDest+=4;pSrc+=4;
}
}
else
{
nCount*=sizeof(DWORD);
CopyMemory(pDest,pSrc,nCount);
}
}
//16位ROP渲染
void CROP16::CopyPen(CROP &rp)
{
PWORD p=PWORD(rp.p);
*p=WORD(rp.c);
}
void CROP16::XorPen(CROP &rp)
{
PWORD p=PWORD(rp.p);
*p^=WORD(rp.c);
}
void CROP16::AndPen(CROP &rp)
{
PWORD p=PWORD(rp.p);
*p&=WORD(rp.c);
}
void CROP16::AndNotPen(CROP &rp)
{
PWORD p=PWORD(rp.p);
*p&=WORD(~rp.c);
}
void CROP16::AndPenNot(CROP &rp)
{
PWORD p=PWORD(rp.p);
*p=~(*p)&WORD(rp.c);
}
void CROP16::OrPen(CROP &rp)
{
PWORD p=PWORD(rp.p);
*p|=WORD(rp.c);
}
void CROP16::OrNotPen(CROP &rp)
{
PWORD p=PWORD(rp.p);
*p|=WORD(~rp.c);
}
void CROP16::OrPenNot(CROP &rp)
{
PWORD p=PWORD(rp.p);
*p=~*p|WORD(rp.c);
}
void CROP16::NotCopyPen(CROP &rp)
{
PWORD p=PWORD(rp.p);
*p=WORD(~rp.c);
}
void CROP16::NotAndPen(CROP &rp)
{
PWORD p=PWORD(rp.p);
*p&=WORD(rp.c);*p=~*p;
}
void CROP16::NotOrPen(CROP &rp)
{
PWORD p=PWORD(rp.p);
*p|=WORD(rp.c);*p=~*p;
}
void CROP16::NotXorPen(CROP &rp)
{
PWORD p=PWORD(rp.p);
*p^=WORD(rp.c);*p=~*p;
}
void CROP16::AlphaPen(CROP &rp)
{
DWORD r,g,b,c=*PWORD(rp.p),a=rp.a;
r=c>>11;r=(r<<3)|(r>>2);
r*=a;r+=rp.r;r>>=11;r<<=11;
g=c<<21;g>>=26;g=(g<<2)|(g>>4);
g*=a;g+=rp.g;g>>=10;g<<=5;
b=c&0x1f;b=(b<<3)|(b>>2);
b*=a;b+=rp.b;b>>=11;
*PWORD(rp.p)=WORD(r|g|b);
}
void CROP16::AlphaBlend(CROP &rp)
{
DWORD r,g,b,c=*PWORD(rp.p),a=rp.a;
DWORD ar,ag,ab,ac=rp.c,aa=256-a;
ar=ac>>11;ar=(ar<<3)|(ar>>2);
ar*=aa;ar+=127;
ag=ac<<21;ag>>=26;ag=(ag<<2)|(ag>>4);
ag*=aa;ag+=127;
ab=ac&0x1f;ab=(ab<<3)|(ab>>2);
ab*=aa;ab+=127;
r=c>>11;r=(r<<3)|(r>>2);
r*=a;r+=ar;r>>=11;r<<=11;
g=c<<21;g>>=26;g=(g<<2)|(g>>4);
g*=a;g+=ag;g>>=10;g<<=5;
b=c&0x1f;b=(b<<3)|(b>>2);
b*=a;b+=ab;b>>=11;
*PWORD(rp.p)=WORD(r|g|b);
}
void CROP16::AlphaBlendPen(CROP &rp)
{
CopyPen(rp);
AlphaPen(rp);
}
//16位ROP操作
void CROP16::GetColorIndex(CROP &rp)
{
PDWORD aColor=PDWORD(rp.i);
*PDWORD(rp.c)=aColor[*PWORD(rp.p)];
}
void CROP16::GetColor1(CROP &rp)
{
*PDWORD(rp.c)=*PWORD(rp.p)?1:0;
}
void CROP16::GetColor4(CROP &rp)
{
DWORD c=*PWORD(rp.p);
DWORD r=c<<16,g=c<<21,b=c<<27,h;
h=r|g|b;h>>=28;h&=8;
r>>=30;r|=r>>1;r&=1;
g>>=29;g|=g>>1;g&=2;
b>>=28;b|=b>>1;b&=4;
*PDWORD(rp.c)=r|g|b|h;
}
void CROP16::GetColor8(CROP &rp)
{
DWORD r,g,b,c=*PWORD(rp.p);
r=(c>>8)&0xe0;
g=(c>>6)&0x1c;
b=(c>>3)&3;
*PDWORD(rp.c)=r|g|b;
}
void CROP16::GetColor16(CROP &rp)
{
*PDWORD(rp.c)=*PWORD(rp.p);
}
void CROP16::GetColor24(CROP &rp)
{
DWORD r,g,b,c=*PWORD(rp.p);
r=c>>11;r=(r<<3)|(r>>2);r<<=16;
g=c<<21;g>>=26;g=(g<<2)|(g>>4);g<<=8;
b=c<<27;b>>=27;b=(b<<3)|(b>>2);
*PDWORD(rp.c)=r|g|b;
}
void CROP16::RpIfScr(CROP &rp)
{
DWORD c=*PWORD(rp.p);
if(c==rp.i)rp.ROP(rp);
}
void CROP16::RpIfNotScr(CROP &rp)
{
DWORD c=*PWORD(rp.p);
if(c!=rp.i)rp.ROP(rp);
}
void CROP16::SetPenColor(CROP &rp)
{
DWORD c=rp.c;
if(c & 0xff000000)
{
rp.r=(c&0xff);
rp.g=(c>>8)&0xff;
rp.b=(c>>16)&0xff;
rp.c=(rp.r<<16)|(rp.g<<8)|(rp.b);
c>>=24;rp.a=c;c=256-c;
rp.r*=c;rp.r+=127;
rp.g*=c;rp.g+=127;
rp.b*=c;rp.b+=127;
}
else
{
rp.r=(c>>3)&31;
rp.g=(c>>10)&63;
rp.b=(c>>19)&31;
rp.c=(rp.r<<11)|(rp.g<<5)|rp.b;
rp.a=0;
}
}
void CROP16::CopyPalette(CROP &rp)
{
DWORD r,g,b,c;
int nCount=rp.c;
PDWORD pSrc=PDWORD(rp.a);
PDWORD pDest=PDWORD(rp.i);
if(nCount<0)
{
while(nCount++)
{
c=*pSrc++;
r=(c<<8)&0xf800;g=(c<<3)&0x07e0;b=(c>>3)&0x001f;
*pDest++=r|g|b;
}
}
else
{
while(nCount--)
{
c=*pSrc++;
r=(c>>8)&0xf800;g=(c>>5)&0x07e0;b=(c>>3)&0x001f;
*pDest++=r|g|b;
}
}
}
PFNROP CROP16::GetProc(int nRop)
{
PFNROP pProc;
switch(nRop)
{
case R2_COPYPEN:pProc=CopyPen;break;
case R2_PRVRPIFSCR:pProc=RpIfScr;break;
case R2_PRVRPIFNOTSCR:pProc=RpIfNotScr;break;
case R2_PRVRPIFPEN:pProc=RpIfPen;break;
case R2_PRVRPIFNOTPEN:pProc=RpIfNotPen;break;
case R2_XORPEN:pProc=XorPen;break;
case R2_MASKPEN:pProc=AndPen;break;
case R2_MASKNOTPEN:pProc=AndNotPen;break;
case R2_MASKPENNOT:pProc=AndPenNot;break;
case R2_MERGEPEN:pProc=OrPen;break;
case R2_MERGENOTPEN:pProc=OrNotPen;break;
case R2_MERGEPENNOT:pProc=OrPenNot;break;
case R2_NOTCOPYPEN:pProc=NotCopyPen;break;
case R2_NOTMASKPEN:pProc=NotAndPen;break;
case R2_NOTMERGEPEN:pProc=NotOrPen;break;
case R2_NOTXORPEN:pProc=NotXorPen;break;
case R2_ALPHAPEN:pProc=AlphaPen;break;
case R2_ALPHABLEND:pProc=AlphaBlend;break;
case R2_ALPHABLENDPEN:pProc=AlphaBlendPen;break;
case R2_GETCOLORINDEX:pProc=GetColorIndex;break;
case R2_GETCOLOR1:pProc=GetColor1;break;
case R2_GETCOLOR4:pProc=GetColor4;break;
case R2_GETCOLOR8:pProc=GetColor8;break;
case R2_GETCOLOR16:pProc=GetColor16;break;
case R2_GETCOLOR24:pProc=GetColor24;break;
case R2_SETPENCOLOR:pProc=SetPenColor;break;
case R2_COPYPALETTE:pProc=CopyPalette;break;
default:
pProc=RpNone;break;
}
return pProc;
}
//8位ROP渲染
void CROP8::CopyPen(CROP &rp)
{
PBYTE p=PBYTE(rp.p);
*p=BYTE(rp.c);
}
void CROP8::XorPen(CROP &rp)
{
PBYTE p=PBYTE(rp.p);
*p^=BYTE(rp.c);
}
void CROP8::AndPen(CROP &rp)
{
PBYTE p=PBYTE(rp.p);
*p&=BYTE(rp.c);
}
void CROP8::AndNotPen(CROP &rp)
{
PBYTE p=PBYTE(rp.p);
*p&=BYTE(~rp.c);
}
void CROP8::AndPenNot(CROP &rp)
{
PBYTE p=PBYTE(rp.p);
*p=~(*p)&BYTE(rp.c);
}
void CROP8::OrPen(CROP &rp)
{
PBYTE p=PBYTE(rp.p);
*p|=BYTE(rp.c);
}
void CROP8::OrNotPen(CROP &rp)
{
PBYTE p=PBYTE(rp.p);
*p|=BYTE(~rp.c);
}
void CROP8::OrPenNot(CROP &rp)
{
PBYTE p=PBYTE(rp.p);
*p=~*p|BYTE(rp.c);
}
void CROP8::NotCopyPen(CROP &rp)
{
PBYTE p=PBYTE(rp.p);
*p=BYTE(~rp.c);
}
void CROP8::NotAndPen(CROP &rp)
{
PBYTE p=PBYTE(rp.p);
*p&=BYTE(rp.c);*p=~*p;
}
void CROP8::NotOrPen(CROP &rp)
{
PBYTE p=PBYTE(rp.p);
*p|=BYTE(rp.c);*p=~*p;
}
void CROP8::NotXorPen(CROP &rp)
{
PBYTE p=PBYTE(rp.p);
*p^=BYTE(rp.c);*p=~*p;
}
void CROP8::AlphaPen(CROP &rp)
{
DWORD r,g,b,c=*PBYTE(rp.p),a=rp.a;
r=c>>5;r=(r<<5)|(r<<2)|(r>>1);
r*=a;r+=rp.r;r>>=13;r<<=5;
g=c<<27;g>>=29;g=(g<<5)|(g<<2)|(g>>1);
g*=a;g+=rp.g;g>>=13;g<<=2;
b=c&3;b|=b<<2;b|=b<<2;
b*=a;b+=rp.b;b>>=14;
*PBYTE(rp.p)=BYTE(r|g|b);
}
void CROP8::AlphaBlend(CROP &rp)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -