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

📄 pgesurface.cpp

📁 使ppc屏幕变成黑白的程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	int ix = 0, iy = 0;
	WORD wPos = 0;
	for (iy=pRect->top; iy<pRect->bottom; iy++)
	{
		isx = 0;
		for (ix=pRect->left; ix<pRect->right; ix++)
		{
			wPos = iy*m_SurfaceInfo.wWiedth + ix;
			if (m_pbtAlphaChanle[wPos] != 0)
				m_pbtAlphaChanle[wPos] = 
					pbtAlphaData[isy*iStep + isx];
			isx++;
		}
		isy++;
	}

	//pgeR(5, 重置Alpha通道标志) = 1;
}

void CPGESurface::RestoreAlphaChanle(RECT* pRect)
{
	// 大量的memcpy同样耗时!
	if (!m_bAlphaChanle) return;
	//if (pgeR(5, 重置Alpha通道标志) != 1) return;
	for (int iy=pRect->top; iy<pRect->bottom; iy++)
	{		
		memcpy(m_pbtAlphaChanle+iy*m_SurfaceInfo.wWiedth, 
			m_pbtAlphaChanleStatic+iy*m_SurfaceInfo.wWiedth, pRect->right);
	}
	//pgeR(5, 重置Alpha通道标志) = 0;

}

BYTE* CPGESurface::GetStaticAlphaChanle(WORD wKey)
{
	if (wKey == 0x7819 && m_bAlphaChanle)
	{
		return m_pbtAlphaChanleStatic;
	}
	return NULL;
}

PGE_RESULT CPGESurface::CreateAlphaWithMaskColor()
{
	if (m_btSurfaceBit < 16) return PGE_FAIL;
	if (m_bAlphaChanle != 0) return PGE_FAIL;
	m_bAlphaChanle = TRUE;
	m_pbtAlphaChanleStatic = new BYTE[m_dwDataSize];
	m_pbtAlphaChanle = new BYTE[m_dwDataSize];
	
	memset(m_pbtAlphaChanle, 0, m_dwDataSize);
	memset(m_pbtAlphaChanleStatic, 0, m_dwDataSize);

	for (int i=0; i<m_dwDataSize; i++)
	{
		if (m_pwMainData[i] != m_dwMaskColor)
		{
			m_pbtAlphaChanleStatic[i] = m_pbtAlphaChanle[i] = 32;
		}
	}

	return PGE_OK;
}

void CPGESurface::SetReplaceColor(WORD wColor)
{
	m_wRplaceColor = wColor;
}

WORD CPGESurface::GetReplaceColor()
{
	return m_wRplaceColor;
}

void CPGESurface::SetPiexl(int x, int y, WORD wColor)
{
	if (m_btSurfaceBit < 16) return;
	int iPos = y*m_SurfaceInfo.wWiedth+x;
	if (iPos < 0 || iPos > m_dwDataSize) return;
	//if(m_btSurfaceBit < 16)
	//{
	//	((BYTE*)m_pwMainData)[iPos] = wColor>>8;
	//	return;
	//}
	m_pwMainData[iPos] = wColor;
}

POINT ppt[500];
void CPGESurface::DrawLine(int x1, int y1, int x2, int y2, WORD wColor)
{
	register int t;
	int distance;
	int x=0,y=0,delta_x,delta_y,incx,incy;
	delta_x = x2-x1;
	delta_y = y2-y1;
	//根据x和y的变化量设置x和y的增长方式(每次加1还是减1或者是不变)
	if(delta_x>0) 
	{
		incx=1;
	}
	else if (delta_x==0) 
	{
		incx=0;
	}
	else 
	{
		delta_x=-delta_x; 
		incx=-1;
	}
	

	if (delta_y>0) 
	{
		incy=1;
	}
	else if (delta_y==0) 
	{	
		incy=0;
	}
	else 
	{
		delta_y=-delta_y; 
		incy=-1;
	}
	

	if(delta_x>delta_y)
	{
		distance=delta_x;
	}
	else
	{
		distance=delta_y;
	}

	//开始画线了	
	//一样的Bresenham算法
	//看看右边的图先

	//两个端点也要画
	for (t=0; t<distance+2; t++)
	{
		//画点
		ppt[t].x = x1;
		ppt[t].y = y1;
		SetPiexl(x1, y1, wColor);	 
		x+=delta_x;					   
		y+=delta_y;						
		if(x>distance)					 
		{								 
			x-=distance;				 
			x1+=incx;					
		}								
		if(y>distance)					
		{								
			y-=distance;				
			y1+=incy;					
		}								
	}
	int pp=0;
}													 

void CPGESurface::DrawRect(int x1, int y1, int x2, int y2, WORD wColor)
{
	DrawLine(x1, y1, x2, y1, wColor);
	DrawLine(x1, y1, x1, y2, wColor);
	DrawLine(x2, y1, x2, y2, wColor);
	DrawLine(x1, y2, x2, y2, wColor);
}


/////////////////////////////////////////////////////////////
/////////////Surface Globe Function//////////////////////////
void CreateSurfaceFromFile(CPGESurface** pSurface, char* caFileName, 
								 CPGEDevice* pDevice, DWORD wMaskColor)
{
	int iSize = strlen(caFileName) - 1;

	char caTmp = caFileName[iSize - 2];
	if (caTmp < 97) caTmp = caTmp + 32;

	if (caTmp == 'p')
	{
		FILE* pf = PGEFileOpen(caFileName, "rb");
		if (pf == NULL) 
		{
			return;
		}
		PGEPicBaseHead PicHead;
		fread(&PicHead, sizeof(PGEPicBaseHead), 1, pf);
		
		if (PicHead.dwHeadFlag != *((DWORD*)"PGEP"))
		{
			return;
		}
		DWORD dwpgpX = PicHead.wWidth;
		DWORD dwpgpY = PicHead.wHeight;
		BOOL bAlpha = PicHead.bBitCount & 0x80;
		BYTE btCount = PicHead.bBitCount & 0x7f;
		BOOL bCompress = PicHead.bCompess;
		
		WORD* pPal = NULL;
		if (PicHead.wPalPiexlCount)
		{
			pPal = new WORD[PicHead.wPalPiexlCount];
			fseek(pf, PicHead.dwPalOffset, SEEK_SET);
			fread(pPal, PicHead.dwPalSize, 1, pf);
		}

		DWORD dwSize = dwpgpX * dwpgpY;

		BYTE* pBmpData = NULL;
		if(bCompress)
			pBmpData = new BYTE[PicHead.dwDeComSize];
		else
			pBmpData = new BYTE[PicHead.dwDataSize];


		fseek(pf, PicHead.dwDataOffset, SEEK_SET);

		BYTE* btCpBuf = NULL;
		if(bCompress)
		{
			btCpBuf = new BYTE[PicHead.dwDataSize];
			fread(btCpBuf, PicHead.dwDataSize, 1, pf);
			decompress(btCpBuf, PicHead.dwDataSize, pBmpData);
			SAFE_DELETE_ARY(btCpBuf);
		}
		else
		{
			fread(pBmpData, PicHead.dwDataSize, 1, pf);
		}


		if ((* pSurface) == NULL)
		{
			(*pSurface) = new CPGESurface(pDevice);
		}
	
		if (btCount == 8)
		{
			(*pSurface)->SetPal(pPal, PicHead.wPalPiexlCount);
		}
		(*pSurface)->CreateSurface(dwpgpY, dwpgpX, PGE_PGP_SURFACE, wMaskColor);

		BYTE* pAlphaBuf = NULL;
		if (bAlpha)	// 带Alpha通道
		{
			if (bCompress)
			{
				BYTE* pAlphaRdBuf = new BYTE[PicHead.dwAlphaSize];
				pAlphaBuf = new BYTE[PicHead.dwAlphaDeComSize];
				fseek(pf, SEEK_SET, PicHead.dwAlphaOffset);
				fread(pAlphaRdBuf, PicHead.dwAlphaSize, 1, pf);
				int a = decompress(pAlphaRdBuf, PicHead.dwAlphaSize, pAlphaBuf);
				SAFE_DELETE_ARY(pAlphaRdBuf);

			}
			else
			{
				pAlphaBuf = new BYTE[PicHead.dwAlphaSize];
				fseek(pf, SEEK_SET, PicHead.dwAlphaOffset);
				fread(pAlphaBuf, PicHead.dwAlphaSize, 1, pf);
			}
		}
		fclose(pf);

		(*pSurface)->SetPgpSurface((WORD*)pBmpData, pAlphaBuf);

	}
	else if (caTmp == 'b')
	{
		FILE* pf = PGEFileOpen(caFileName, "rb");
		if (pf == NULL) 
		{
			return;
		}
		BITMAPFILEHEADER bm;
		fread(&bm, 1, sizeof(BITMAPFILEHEADER), pf);
		if (bm.bfType!=*(WORD*)"BM")
		{		//AfxMessageBox("非位图文件");
			fclose(pf);
			return;
		}
		BITMAPINFOHEADER bmif;
		fread(&bmif, 1, sizeof(BITMAPINFOHEADER), pf);
		int bmx = bmif.biWidth;
		int bmy = bmif.biHeight>0?bmif.biHeight:(-bmif.biHeight);


		if (bmif.biBitCount < 8 || bmif.biCompression != 0) 
		{
			fclose(pf);
			return;
		}

		RGBQUAD *pRgb = NULL;
		if (bmif.biBitCount == 8) // 256色bmp
		{
			pRgb = (RGBQUAD*) new BYTE[bmif.biClrUsed * sizeof(RGBQUAD)];
			fread(pRgb, bmif.biClrUsed * sizeof(RGBQUAD), 1, pf);
		}

		BOOL bAlpha = FALSE;
		if (bmif.biBitCount == 32)	bAlpha = TRUE;// 带Alpha通道

		DWORD dwRealWidth = (((bmx*bmif.biBitCount)+31)>>5)<<2;
		int iBitSteps = bmif.biBitCount>>3;
		DWORD iSize = dwRealWidth*bmy*iBitSteps;

		BYTE* pBmpData = new BYTE[iSize];

		fseek(pf, bm.bfOffBits, SEEK_SET);
		fread(pBmpData, 1, iSize, pf);
		fclose(pf);

		if ((* pSurface) == NULL)
		{
			//ASSERT(pDevice);
			(*pSurface) = new CPGESurface(pDevice);
		}

		(*pSurface)->CreateSurface(bmy, bmx, PGE_NOMARL_SURFACE, wMaskColor);
		if (bAlpha)	// 带Alpha通道
		{
			(*pSurface)->EnableAlphaChanle();
		}

		WORD* pBuff = NULL;
		BYTE* pbtBuff = (*pSurface)->GetAlphaChanle();
		BYTE* pbtBuff1 = (*pSurface)->GetStaticAlphaChanle(0x7819);

		(*pSurface)->Lock((void**)&pBuff);

		int iy,ix;
		BYTE btPil;
		WORD caTmp[3];
		DWORD dwDataOff = 0;
		for(iy=0; iy<bmy; iy++)
		{
			for (ix=0; ix<bmx; ix++)
			{		
				if (pRgb == NULL)
				{			
					caTmp[0] = pBmpData[(iy*(dwRealWidth)+(ix*iBitSteps)) + 2];
					caTmp[1] = pBmpData[(iy*(dwRealWidth)+(ix*iBitSteps)) + 1];
					caTmp[2] = pBmpData[(iy*(dwRealWidth)+(ix*iBitSteps))];
				}
				else
				{
					btPil = pBmpData[(iy*(dwRealWidth)+(ix*iBitSteps))];
					if (bmif.biClrUsed != 0)
					{
						caTmp[0] = pRgb[btPil].rgbRed;
						caTmp[1] = pRgb[btPil].rgbGreen;
						caTmp[2] = pRgb[btPil].rgbBlue;
					}
					else
					{
						caTmp[0] = caTmp[1] = caTmp[2] = btPil;
					}

				}

				if (bmif.biHeight<0)		// 有时bmp图像的高会是负值,这时则不用颠倒 
				{
					dwDataOff = iy*bmx + ix;
				}
				else
				{
					dwDataOff = (bmy-iy-1)*bmx + ix;
				}

				if (bAlpha)
				{
					DWORD dbf=pBmpData[(iy*(dwRealWidth)+(ix*iBitSteps)) + 3];
					pbtBuff1[dwDataOff] = pbtBuff[dwDataOff] = ((float)dbf/255.f)*31;
				}

				pBuff[dwDataOff] = RGBto16bit565(caTmp[0], caTmp[1], caTmp[2]);

			}
		}
		SAFE_DELETE_ARY(pBmpData);
		SAFE_DELETE_ARY(pRgb);
		(*pSurface)->unLock();

	}
	
}

_inline void MakeAlpha(WORD* wpSrc, WORD* wpDes, BYTE btAlpha)
{
	register DWORD d1;
	register DWORD wa = *wpSrc;
	register DWORD wb = *wpDes;
	register DWORD alpha = btAlpha;

	d1 = (((((((wa << 16) | wa) & 0x7e0f81f) - (((wb << 16) | wb) & 0x7e0f81f)) * alpha) >> 5) + (((wb << 16) | wb) & 0x7e0f81f)) & 0x7e0f81f;
	wa = (d1 & 0xffff0000)>>16;
	wb = d1 & 0xffff;
	*wpDes = wa | wb;
//	register BYTE bSrcR, bSrcG,bSrcB, bDisR, bDisG, bDisB;
//	bSrcR = (*wpSrc & 0xf800) >> 8;
//	bSrcG = (*wpSrc & 0x7e0) >> 3;
//	bSrcB = (*wpSrc & 0x1f) << 3; 
//	
//	bDisR = (*wpDes & 0xf800) >> 8;
//	bDisG = (*wpDes & 0x7e0) >> 3;
//	bDisB = (*wpDes & 0x1f) << 3; 
//
//#define apl(c1,c2) (c1*wAlpha+(255-wAlpha)*c2)>>8
//	*wpDes = RGBto16bit565(apl(bSrcR, bDisR), apl(bSrcG, bDisG), apl(bSrcB, bDisB));
}

__inline void MakeADD(WORD* wpSrc, WORD* wpDes)
{
	register DWORD tdest = 0;
	register DWORD t;

	t = (*wpSrc & 0xf800) + (*wpDes & 0xf800);
	if(t > 0xf800) t = 0xf800;
		tdest |= t;

	t = (*wpSrc & 0x7e0) + (*wpDes & 0x7e0);
	if(t > 0x7e0) t = 0x7e0;
		tdest |= t;

	t = (*wpSrc & 0x1f) + (*wpDes & 0x1f);
	if(t > 0x1f) t = 0x1f;
		tdest |= t;


	*wpDes = (WORD)tdest;
}


PGE_RESULT CreateAlphaFromFile(CPGESurface* pSurface, 
							   char* caFileName)
{
	if (pSurface->GetSurfaceInfo()->wSurfaceTp == PGE_PGP_SURFACE) return PGE_FAIL;
	FILE* pf = PGEFileOpen(caFileName, "rb");
	if (pf == NULL) 
	{
		return PGE_FAIL;
	}
	BITMAPFILEHEADER bm;
	fread(&bm, 1, sizeof(BITMAPFILEHEADER), pf);
	if (bm.bfType!=*(WORD*)"BM")
	{		//AfxMessageBox("非位图文件");
		fclose(pf);
		return 0;
	}
	BITMAPINFOHEADER bmif;
	fread(&bmif, 1, sizeof(BITMAPINFOHEADER), pf);
	int bmx = bmif.biWidth;
	int bmy = bmif.biHeight;

	if (bmif.biBitCount != 8) 
	{
		fclose(pf);
		return PGE_FAIL;
	}

	RGBQUAD *pRgb = NULL;
	if (bmif.biBitCount == 8) // 256色bmp
	{
		pRgb = (RGBQUAD*) new BYTE[bmif.biClrUsed * sizeof(RGBQUAD)];
		fread(pRgb, bmif.biClrUsed * sizeof(RGBQUAD), 1, pf);
	}


	DWORD dwRealWidth = (((bmx*bmif.biBitCount)+31)>>5)<<2;
	int iBitSteps = bmif.biBitCount>>3;
	int iSize = dwRealWidth*bmy*iBitSteps;

	BYTE* pBmpData = new BYTE[iSize];

	fseek(pf, bm.bfOffBits, SEEK_SET);
	fread(pBmpData, 1, iSize, pf);
	fclose(pf);

	pSurface->EnableAlphaChanle();
	BYTE* pbtAlpha = pSurface->GetAlphaChanle();
	BYTE* pbtBuff1 = pSurface->GetStaticAlphaChanle(0x7819);

	int iy,ix;
	BYTE btPil;
	WORD caTmp[3];
	for(iy=0; iy<bmy; iy++)
	{
		for (ix=0; ix<bmx; ix++)
		{
			btPil = pBmpData[(iy*(dwRealWidth)+(ix*iBitSteps))];
			//if (bmif.biClrUsed != 0)
			//{
			//	caTmp[0] = pRgb[btPil].rgbRed;
			//	caTmp[1] = pRgb[btPil].rgbGreen;
			//	caTmp[2] = pRgb[btPil].rgbBlue;
			//}
			//else
			{
				caTmp[0] = caTmp[1] = caTmp[2] = btPil;
			}

			BYTE ba = RGBto16bit565(caTmp[0], caTmp[1], caTmp[2]);
			if (ba != 0)
			{
				int sa = 0;
			}
			pbtBuff1[(bmy-iy-1)*bmx + ix] = pbtAlpha[(bmy-iy-1)*bmx + ix] = ((float)(255-ba)/255.f)*32;
		}

	}

	SAFE_DELETE_ARY(pBmpData);
	SAFE_DELETE_ARY(pRgb);
	return 0;

}

⌨️ 快捷键说明

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