📄 rop2.cpp
字号:
{
DWORD r,g,b,c=*PWORD(rp.p),a=rp.a;
DWORD ar,ag,ab,ac=rp.c,aa=256-a;
ar=ac>>5;ar=(ar<<5)|(ar<<2)|(ar>>1);
ar*=aa;ar+=127;
ag=ac<<27;ag>>=29;ag=(ag<<5)|(ag<<2)|(ag>>1);
ag*=aa;ag+=127;
ab=ac&3;ab|=ab<<2;ab|=ab<<2;
ab*=aa;ab+=127;
r=c>>5;r=(r<<5)|(r<<2)|(r>>1);
r*=a;r+=ar;r>>=13;r<<=5;
g=c<<27;g>>=29;g=(g<<5)|(g<<2)|(g>>1);
g*=a;g+=ag;g>>=13;g<<=2;
b=c&3;b|=b<<2;b|=b<<2;
b*=a;b+=ab;b>>=14;
*PBYTE(rp.p)=BYTE(r|g|b);
}
void CROP8::AlphaBlendPen(CROP &rp)
{
CopyPen(rp);
AlphaPen(rp);
}
//8位ROP操作
void CROP8::GetColorIndex(CROP &rp)
{
PDWORD aColor=PDWORD(rp.i);
*PDWORD(rp.c)=aColor[*PBYTE(rp.p)];
}
void CROP8::GetColor1(CROP &rp)
{
*PDWORD(rp.c)=*PBYTE(rp.p)?1:0;
}
void CROP8::GetColor4(CROP &rp)
{
DWORD c=*PWORD(rp.p);
DWORD r=c<<24,g=c<<27,b=c<<30,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 CROP8::GetColor8(CROP &rp)
{
*PDWORD(rp.c)=*PBYTE(rp.p);
}
void CROP8::GetColor16(CROP &rp)
{
DWORD r,g,b,c=*PBYTE(rp.p);
r=c>>5;r=(r<<2)|(r>>1);r<<=5;
g=c<<27;g>>=29;g=(g<<3)|g;g<<=2;
b=c&3;b=(b<<3)|(b<<1)|(b>>1);
*PDWORD(rp.c)=r|g|b;
}
void CROP8::GetColor24(CROP &rp)
{
DWORD r,g,b,c=*PBYTE(rp.p);
r=c>>5;r=(r<<5)|(r<<2)|(r>>1);r<<=16;
g=c<<27;g>>=29;g=(g<<5)|(g<<2)|(g>>1);g<<=8;
b=c&3;b|=b<<2;b|=b<<4;
*PDWORD(rp.c)=r|g|b;
}
void CROP8::RpIfScr(CROP &rp)
{
DWORD c=*PBYTE(rp.p);
if(c==rp.i)rp.ROP(rp);
}
void CROP8::RpIfNotScr(CROP &rp)
{
DWORD c=*PBYTE(rp.p);
if(c!=rp.i)rp.ROP(rp);
}
void CROP8::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>>5)&7;
rp.g=(c>>13)&7;
rp.b=(c>>22)&3;
rp.c=(rp.r<<5)|(rp.g<<2)|rp.b;
rp.a=0;
}
}
void CROP8::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>>5)&7;g=(c>>13)&7;b=(c>>22)&3;
*pDest++=(r<<5)|(g<<2)|b;
}
}
else
{
while(nCount--)
{
c=*pSrc++;
r=(c>>16)&7;g=(c>>11)&7;b=(c>>6)&3;
*pDest++=(r<<5)|(g<<2)|b;
}
}
}
PFNROP CROP8::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;
}
//4位ROP渲染
void CROP4::CopyPen(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD clr,sc=DWORD(*p);
if((nOffset&1)){clr=rp.c;*p = BYTE(clr&0x0f|(sc&0xf0));}
else {clr=rp.c<<4;*p = BYTE(clr&0xf0|(sc&0x0f));}
}
void CROP4::XorPen(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD clr,sc=DWORD(*p);
if((nOffset&1)){clr=rp.c^sc;*p = BYTE(clr&0x0f|(sc&0xf0));}
else {clr=(rp.c<<4)^sc;*p = BYTE(clr&0xf0|(sc&0x0f));}
}
void CROP4::AndPen(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD clr,sc=DWORD(*p);
if((nOffset&1)){clr=rp.c≻*p = BYTE(clr&0x0f|(sc&0xf0));}
else {clr=(rp.c<<4)≻*p = BYTE(clr&0xf0|(sc&0x0f));}
}
void CROP4::AndNotPen(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD clr,sc=DWORD(*p);
if((nOffset&1)){clr=~rp.c≻*p = BYTE(clr&0x0f|(sc&0xf0));}
else {clr=~(rp.c<<4)≻*p = BYTE(clr&0xf0|(sc&0x0f));}
}
void CROP4::AndPenNot(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD clr,sc=DWORD(*p);
if((nOffset&1)){clr=rp.c^sc;*p = BYTE(clr&0x0f|(sc&0xf0));}
else {clr=(rp.c<<4)^sc;*p = BYTE(clr&0xf0|(sc&0x0f));}
}
void CROP4::OrPen(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD clr,sc=DWORD(*p);
if((nOffset&1)){clr=rp.c|sc;*p = BYTE(clr&0x0f|(sc&0xf0));}
else {clr=(rp.c<<4)|sc;*p = BYTE(clr&0xf0|(sc&0x0f));}
}
void CROP4::OrNotPen(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD clr,sc=DWORD(*p);
if((nOffset&1)){clr=~rp.c|sc;*p = BYTE(clr&0x0f|(sc&0xf0));}
else {clr=~(rp.c<<4)|sc;*p = BYTE(clr&0xf0|(sc&0x0f));}
}
void CROP4::OrPenNot(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD clr,sc=DWORD(*p);
if((nOffset&1)){clr=rp.c^~sc;*p = BYTE(clr&0x0f|(sc&0xf0));}
else {clr=(rp.c<<4)^~sc;*p = BYTE(clr&0xf0|(sc&0x0f));}
}
void CROP4::NotCopyPen(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD clr,sc=DWORD(*p);
if((nOffset&1)){clr=~rp.c;*p = BYTE(clr&0x0f|(sc&0xf0));}
else {clr=~(rp.c<<4);*p = BYTE(clr&0xf0|(sc&0x0f));}
}
void CROP4::NotAndPen(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD clr,sc=DWORD(*p);
if((nOffset&1)){clr=~(rp.c&sc);*p = BYTE(clr&0x0f|(sc&0xf0));}
else {clr=~((rp.c<<4)&sc);*p = BYTE(clr&0xf0|(sc&0x0f));}
}
void CROP4::NotOrPen(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD clr,sc=DWORD(*p);
if((nOffset&1)){clr=~(rp.c|sc);*p = BYTE(clr&0x0f|(sc&0xf0));}
else {clr=~((rp.c<<4)|sc);*p = BYTE(clr&0xf0|(sc&0x0f));}
}
void CROP4::NotXorPen(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD clr,sc=DWORD(*p);
if((nOffset&1)){clr=~(rp.c^sc);*p = BYTE(clr&0x0f|(sc&0xf0));}
else {clr=~((rp.c<<4)^sc);*p = BYTE(clr&0xf0|(sc&0x0f));}
}
//4位ROP操作
void CROP4::GetColorIndex(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD sc=DWORD(*p);
PDWORD aColor=PDWORD(rp.i);
if(nOffset&4)sc&=0x0f;else sc>>=4;
*PDWORD(rp.c)=aColor[sc];
}
void CROP4::GetColor1(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD sc=DWORD(*p);
if(nOffset&4)sc&=0x0f;else sc>>=4;
*PDWORD(rp.c)=sc?1:0;
}
void CROP4::GetColor4(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD sc=DWORD(*p);
if(nOffset&4)sc&=0x0f;else sc>>=4;
*PDWORD(rp.c)=sc;
}
void CROP4::GetColor8(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD sc=DWORD(*p);
if(nOffset&4)sc&=0x0f;else sc>>=4;
*PDWORD(rp.c)=m_aColor32[sc]>>24;
}
void CROP4::GetColor16(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD sc=DWORD(*p);
if(nOffset&4)sc&=0x0f;else sc>>=4;
*PDWORD(rp.c)=m_aColor16[sc];
}
void CROP4::GetColor24(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD sc=DWORD(*p);
if((nOffset&1)==(rp.m_nStepX>0))sc&=0x0f;else sc>>=4;
*PDWORD(rp.c)=m_aColor32[sc];
}
void CROP4::RpIfScr(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD sc=DWORD(*p);
if((nOffset&1)==(rp.m_nStepX>0))sc&=0x0f;else sc>>=4;
if(sc==rp.i)rp.ROP(rp);
}
void CROP4::RpIfNotScr(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD sc=DWORD(*p);
if((nOffset&1)==(rp.m_nStepX>0))sc&=0x0f;else sc>>=4;
if(sc!=rp.i)rp.ROP(rp);
}
void CROP4::SetPenColor(CROP &rp)
{
rp.r=rp.c;rp.g=rp.c>>8;rp.b=rp.c>>16;
rp.a=rp.r|rp.g|rp.b;rp.a>>=4;rp.a&=8;
rp.r>>=6;rp.r|=rp.r>>1;rp.r&=1;
rp.g>>=5;rp.g|=rp.g>>1;rp.g&=2;
rp.b>>=4;rp.b|=rp.b>>1;rp.b&=4;
rp.c=rp.r|rp.g|rp.b|rp.a;
rp.a=0;
}
void CROP4::CopyPalette(CROP &rp)
{
DWORD r,g,b,c,h;
int nCount=rp.c;
PDWORD pSrc=PDWORD(rp.a);
PDWORD pDest=PDWORD(rp.i);
if(nCount<0)
{
while(nCount++)
{
c=*pSrc++;
r=c;g=c>>8;b=c>>16;
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;
*pDest++=r|g|b|h;
}
}
else
{
while(nCount--)
{
c=*pSrc++;
r=c>>16;g=c>>8;b=c;
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;
*pDest++=r|g|b|h;
}
}
}
PFNROP CROP4::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=CopyPen;break;
case R2_ALPHABLEND:pProc=CopyPen;break;
case R2_ALPHABLENDPEN:pProc=CopyPen;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;
}
//1位ROP渲染
void CROP1::CopyPen(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD sc=DWORD(*p);
DWORD clr=rp.c;
nOffset=~nOffset&7;
sc &= 1<<nOffset; sc |= clr<<nOffset;
*p=sc;
}
void CROP1::XorPen(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD sc=DWORD(*p);
DWORD clr=rp.c^sc;
nOffset=~nOffset&7;
sc &= 1<<nOffset; sc |= clr<<nOffset;
*p=sc;
}
void CROP1::AndPen(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD sc=DWORD(*p);
DWORD clr=rp.c≻
nOffset=~nOffset&7;
sc &= 1<<nOffset; sc |= clr<<nOffset;
*p=sc;
}
void CROP1::AndNotPen(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD sc=DWORD(*p);
DWORD clr=~rp.c≻
nOffset=~nOffset&7;
sc &= 1<<nOffset; sc |= clr<<nOffset;
*p=sc;
}
void CROP1::AndPenNot(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD sc=DWORD(*p);
DWORD clr=rp.c&~sc;
nOffset=~nOffset&7;
sc &= 1<<nOffset; sc |= clr<<nOffset;
*p=sc;
}
void CROP1::OrPen(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD sc=DWORD(*p);
DWORD clr=rp.c|sc;
nOffset=~nOffset&7;
sc &= 1<<nOffset; sc |= clr<<nOffset;
*p=sc;
}
void CROP1::OrNotPen(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD sc=DWORD(*p);
DWORD clr=~rp.c|sc;
nOffset=~nOffset&7;
sc &= 1<<nOffset; sc |= clr<<nOffset;
*p=sc;
}
void CROP1::OrPenNot(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD sc=DWORD(*p);
DWORD clr=rp.c|~sc;
nOffset=~nOffset&7;
sc &= 1<<nOffset; sc |= clr<<nOffset;
*p=sc;
}
void CROP1::NotCopyPen(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD sc=DWORD(*p);
DWORD clr=~rp.c;
nOffset=~nOffset&7;
sc &= 1<<nOffset; sc |= clr<<nOffset;
*p=sc;
}
void CROP1::NotAndPen(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD sc=DWORD(*p);
DWORD clr=~(rp.c&sc);
nOffset=~nOffset&7;
sc &= 1<<nOffset; sc |= clr<<nOffset;
*p=sc;
}
void CROP1::NotOrPen(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD sc=DWORD(*p);
DWORD clr=~(rp.c|sc);
nOffset=~nOffset&7;
sc &= 1<<nOffset; sc |= clr<<nOffset;
*p=sc;
}
void CROP1::NotXorPen(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD sc=DWORD(*p);
DWORD clr=~(rp.c^sc);
nOffset=~nOffset&7;
sc &= 1<<nOffset; sc |= clr<<nOffset;
*p=sc;
}
//1位ROP操作
void CROP1::GetColorIndex(CROP &rp)
{
PDWORD aColor=PDWORD(rp.i);
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD sc=DWORD(*p);
nOffset=~nOffset&7;
*PDWORD(rp.c)=aColor[(sc>>nOffset)&1];
}
void CROP1::GetColor1(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD sc=DWORD(*p);
nOffset=~nOffset&7;
*PDWORD(rp.c)=(sc>>nOffset)&1;
}
void CROP1::GetColor4(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD sc=DWORD(*p);
nOffset=~nOffset&7;
*PDWORD(rp.c)=((sc>>nOffset)&1)?15:0;
}
void CROP1::GetColor8(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD sc=DWORD(*p);
nOffset=~nOffset&7;
*PDWORD(rp.c)=((sc>>nOffset)&1)?255:0;
}
void CROP1::GetColor16(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD sc=DWORD(*p);
nOffset=~nOffset&7;
*PDWORD(rp.c)=((sc>>nOffset)&1)?0xffff:0;
}
void CROP1::GetColor24(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD sc=DWORD(*p);
nOffset=~nOffset&7;
*PDWORD(rp.c)=((sc>>nOffset)&1)?0xffffff:0;
}
void CROP1::RpIfScr(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD sc=DWORD(*p);
nOffset=~nOffset&7;
sc>>=nOffset;sc&=1;
if(sc==rp.i)rp.ROP(rp);
}
void CROP1::RpIfNotScr(CROP &rp)
{
int nOffset=PBYTE(rp.p)-rp.m_pBits;
PBYTE p=rp.m_pBits+(nOffset>>3);
DWORD sc=DWORD(*p);
nOffset=~nOffset&7;
sc>>=nOffset;sc&=1;
if(sc!=rp.i)rp.ROP(rp);
}
void CROP1::SetPenColor(CROP &rp)
{
rp.c=rp.c?1:0;
rp.a=0;
}
void CROP1::CopyPalette(CROP &rp)
{
DWORD c;
int nCount=rp.c;
PDWORD pSrc=PDWORD(rp.a);
PDWORD pDest=PDWORD(rp.i);
if(nCount<0)
{
while(nCount++)
{
c=*pSrc++;
*pDest++=c&0xffffff?1:0;
}
}
else
{
while(nCount--)
{
c=*pSrc++;
*pDest++=c&0xffffff?1:0;
}
}
}
PFNROP CROP1::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=CopyPen;break;
case R2_ALPHABLEND:pProc=CopyPen;break;
case R2_ALPHABLENDPEN:pProc=CopyPen;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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -