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

📄 rop2.cpp

📁 一个更为先进的嵌入式操作系统.采用RMS线程调度算法,具有信号量等同步对象.亦包括GUI. 通过该系统您可以极大知道Windows的内部秘密.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{
	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&sc;*p = BYTE(clr&0x0f|(sc&0xf0));}
	else {clr=(rp.c<<4)&sc;*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&sc;*p = BYTE(clr&0x0f|(sc&0xf0));}
	else {clr=~(rp.c<<4)&sc;*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&sc;
	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&sc;
	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 + -