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

📄 core_graphics.cpp

📁 旋转图像Demo和其源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			break;
		case DDERR_SURFACEBUSY:
			errCode = 4;
			break;
		case DDERR_INVALIDSURFACETYPE:
			errCode = 5;
			break;
		case DDERR_INVALIDPIXELFORMAT:
			errCode = 6;
			break;
		case DDERR_INVALIDCAPS:
			errCode = 7;
			break;
		case DDERR_UNSUPPORTED:
			errCode = 8;
			break;
		case DDERR_GENERIC:
			errCode = 9;
			break;
		default:break;
		}
	}
	/*Lock Dest Surface*/
	DDSURFACEDESC2 ddsdDest;
	memset( &ddsdDest, 0, sizeof(DDSURFACEDESC2) );
	ddsdDest.dwSize = sizeof(DDSURFACEDESC2);
	pGrDest->GetSurface()->Lock( NULL, &ddsdDest, DDLOCK_WAIT, NULL );

	clrKey    = RGB2GDIColor( clrKey );
	BYTE rKey = GetRValue( clrKey );
	BYTE gKey = GetGValue( clrKey );
	BYTE bKey = GetBValue( clrKey );

	/*32 bit*/
	if( ddsdSrc.ddpfPixelFormat.dwRGBBitCount == 32 )
	{
		int iPitch = ((2-w&1)&1);
		PIXEL32* pSrc  = (PIXEL32*)ddsdSrc.lpSurface;
		PIXEL32* pDest = (PIXEL32*)ddsdDest.lpSurface;
		if( mode == 1 )
		{
			int i_x, i_y;//对应的源图上的点
			for( int y=0; y<h; y++ )
			{
				for( int x=0; x<w; x++ )
				{
					i_x      = x1 + ( (y2-y)*sinA  + (x-x2)*cosA );
					i_y      = y1 - ( (y2-y)*cosA  - (x-x2)*sinA );
					if( !( i_x < 0 || i_x >= W || i_y < 0 || i_y >= H ) )
					{
						pSrc = (PIXEL32*)ddsdSrc.lpSurface + i_y*W + i_x;
						if( !( bIsColorKey && ( pSrc->r == rKey && pSrc->g == gKey && pSrc->b == bKey ) ) )
							*pDest = *pSrc;
					}
					pDest++;
				}
				pDest += iPitch;
			}
		}
		else if( mode == 2 )
		{
			float f_x, f_y, a, b, rr, gg, bb, r1, r2;
			int   i_x, i_y, xx, yy;
			for( int y=0; y<h; y++ )
			{
				for( int x=0; x<w; x++ )
				{
					f_y = static_cast<float>( y1 - ( (y2-y)*cosA - (x-x2)*sinA ) );
					i_y = static_cast<int>(floor(f_y));
					a   = f_y - static_cast<float>(floor(f_y));
					f_x = static_cast<float>( x1 + ( (y2-y)*sinA + (x-x2)*cosA ) );
					i_x = static_cast<int>(floor(f_x));
					b   = f_x - static_cast<float>(floor(f_x));
					rr  = gg = bb = 0.0f;
					if( i_x < 0 || i_x >= W || i_y < 0 || i_y >= H )
					{
						pDest++;
						continue;
					}
					pSrc = (PIXEL32*)ddsdSrc.lpSurface + (i_y)*W + i_x; //get src pixel
					if( ( bIsColorKey && ( pSrc->r == rKey && pSrc->g == gKey && pSrc->b == bKey ) ) )
					{
						pDest++;
						continue;
					}
					for(int m=-1; m<3; m++)
					{
						r1 = B3spLine(static_cast<float>(m) - a);
						yy = i_y+m;

						if( yy < -1 || yy > H )
							continue;

						if (yy < 0)
							yy = 0;
						if (yy >= H) 
							yy = H - 1;

						for(int n=-1; n<3; n++) 
						{
							r2 = r1 * B3spLine(b - static_cast<float>(n));
							xx = i_x+n;

							if( xx < -1 || xx > W )
								continue;

							if (xx<0) 
								xx=0;
							if (xx >= W) 
								xx = W - 1;

							pSrc = (PIXEL32*)ddsdSrc.lpSurface + yy*W + xx; //get src pixel
							if( !( bIsColorKey && ( pSrc->r == rKey && pSrc->g == gKey && pSrc->b == bKey ) ) )
							{
								rr += pSrc->r * r2;
								gg += pSrc->g * r2;
								bb += pSrc->b * r2;
							}
						}
					}
					pDest->r = rr;
					pDest->g = gg;
					pDest->b = bb;
					pDest++;
				}//for x
				pDest += iPitch;
			}//for y
		}
	}

	/*16 bit*/
	else if( ddsdSrc.ddpfPixelFormat.dwRGBBitCount == 16 )
	{
		int iPitch = ((4-w&3)&3);
		PIXEL16* pSrc  = (PIXEL16*)ddsdSrc.lpSurface;
		PIXEL16* pDest = (PIXEL16*)ddsdDest.lpSurface;
		if( mode == 1 )
		{
			int i_x, i_y;//对应的源图上的点
			for( int y=0; y<h; y++ )
			{
				for( int x=0; x<w; x++ )
				{
					i_x      = x1 + ( (y2-y)*sinA  + (x-x2)*cosA );
					i_y      = y1 - ( (y2-y)*cosA  - (x-x2)*sinA );
					if( !( i_x < 0 || i_x >= W || i_y < 0 || i_y >= H ) )
					{
						pSrc = (PIXEL16*)ddsdSrc.lpSurface + i_y*W + i_x;
						if( !( bIsColorKey && ( GetR(*pSrc) == rKey && GetG(*pSrc) == gKey && GetB(*pSrc) == bKey ) ) )
							*pDest = *pSrc;
					}
					pDest++;
				}
				pDest += iPitch;
			}
		}
		else if( mode == 2 )
		{
			float f_x, f_y, a, b, rr, gg, bb, r1, r2;
			int   i_x, i_y, xx, yy;
			for( int y=0; y<h; y++ )
			{
				for( int x=0; x<w; x++ )
				{
					f_y = static_cast<float>( y1 - ( (y2-y)*cosA - (x-x2)*sinA ) );
					i_y = static_cast<int>(floor(f_y));
					a   = f_y - static_cast<float>(floor(f_y));
					f_x = static_cast<float>( x1 + ( (y2-y)*sinA + (x-x2)*cosA ) );
					i_x = static_cast<int>(floor(f_x));
					b   = f_x - static_cast<float>(floor(f_x));
					rr  = gg = bb = 0.0f;
					//过滤越界的点
					if( i_x < 0 || i_x >= W || i_y < 0 || i_y >= H )
					{
						pDest++;
						continue;
					}
					pSrc = (PIXEL16*)ddsdSrc.lpSurface + (i_y)*W + i_x; //get src pixel
					//过滤透明色
					if( ( bIsColorKey && ( GetR(*pSrc) == rKey && GetG(*pSrc) == gKey && GetB(*pSrc) == bKey ) ) )
					{
						pDest++;
						continue;
					}
					////在误差范围内的点直接赋值
					//if( a < 0.1f && b < 0.1f )
					//{
					//	*pDest = *pSrc;
					//	pDest++;
					//	continue;
					//}
					for(int m=-1; m<3; m++)
					{
						r1 = B3spLine(static_cast<float>(m) - a);
						yy = i_y+m;

						if( yy < -1 || yy > H )
							continue;

						if (yy < 0)
							yy = 0;
						if (yy >= H) 
							yy = H - 1;

						for(int n=-1; n<3; n++) 
						{
							r2 = r1 * B3spLine(b - static_cast<float>(n));
							xx = i_x+n;

							if( xx < -1 || xx > W )
								continue;

							if (xx<0) 
								xx=0;
							if (xx >= W) 
								xx = W - 1;

							pSrc = (PIXEL16*)ddsdSrc.lpSurface + yy*W + xx; //get src pixel
							BYTE rSrc = GetR( *pSrc );
							BYTE gSrc = GetG( *pSrc );
							BYTE bSrc = GetB( *pSrc );
							if( !( bIsColorKey && ( GetR(*pSrc) == rKey && GetG(*pSrc) == gKey && GetB(*pSrc) == bKey ) ) )
							{
								rr += rSrc * r2;
								gg += gSrc * r2;
								bb += bSrc * r2;
							}
							rr = rSrc;
							gg = gSrc;
							bb = bSrc;
						}
					}
					*pDest = RGB2HI( rr, gg, bb );
					pDest++;
				}//for x
				pDest += iPitch;
			}//for y
		}
	}

	/*UnLock the surface*/
	pGrDest->GetSurface()->Unlock( NULL );
	pGrSrc->GetSurface()->Unlock( NULL );

	return pGrDest;
}


cGraphics* cDirectDraw::RotateImage90( cGraphics* pGrDest, cGraphics* pGrSrc, COLORREF clrBack /* = 0 */ )
{

	DDSURFACEDESC2 ddsdSrc;
	memset( &ddsdSrc, 0, sizeof(DDSURFACEDESC2) );
	ddsdSrc.dwSize = sizeof(DDSURFACEDESC2);
	pGrSrc->GetSurface()->Lock( NULL, &ddsdSrc, DDLOCK_WAIT, NULL );
	BYTE* pSrc = static_cast<BYTE*>(ddsdSrc.lpSurface);
	BYTE* p1   = static_cast<BYTE*>(ddsdSrc.lpSurface);
	int H      = ddsdSrc.dwHeight;
	int W      = ddsdSrc.dwWidth;
	int w	   = H;
	int h	   = W;

	if( pGrDest == NULL )
	{
		pGrDest = new cGraphics();
		pGrDest->Create( w, h );
	}
	pGrDest->ColorFill( clrBack );

	DDSURFACEDESC2 ddsdDest;
	memset( &ddsdDest, 0, sizeof(DDSURFACEDESC2) );
	ddsdDest.dwSize = sizeof(DDSURFACEDESC2);
	pGrDest->GetSurface()->Lock( NULL, &ddsdDest, DDLOCK_WAIT, NULL );
	BYTE* pDest = static_cast<BYTE*>(ddsdDest.lpSurface);
	BYTE* p2    = static_cast<BYTE*>(ddsdDest.lpSurface);

	//旋转中心
	int h1 = H>>1;
	int w1 = W>>1;
	int h2 = (h>>1);
	int w2 = (w>>1);
	int i_x,i_y;

	clrBack    = RGB2GDIColor(clrBack);//
	BYTE rBack = GetRValue(clrBack);
	BYTE gBack = GetGValue(clrBack);
	BYTE bBack = GetBValue(clrBack);

	if( ddsdSrc.ddpfPixelFormat.dwRGBBitCount == 32 )
	{
		int iPitch = ((2-w&1)&1);
		for( int y=0; y<ddsdDest.dwHeight; y++ )
		{
			for( int x=0; x<ddsdDest.dwWidth; x++ )
			{
				//i_x      = x1 + ( (y2-y)*sinA  + (x-x2)*cosA );
				//i_y      = y1 - ( (y2-y)*cosA  - (x-x2)*sinA );
				i_x = w1 + (h2-y);
				i_y = h1 + (x-w2);
				if( i_x >= 0 && i_x < W && i_y >= 0 && i_y < H )
				{
					pSrc  = p1  + (i_y*W<<2)  + (i_x<<2);
					pDest[0] = pSrc[0];
					pDest[1] = pSrc[1];
					pDest[2] = pSrc[2];
				}
				pDest += 4;
			}
			pDest += iPitch<<2;
		}
	}
	else if( ddsdSrc.ddpfPixelFormat.dwRGBBitCount == 16 )
	{
		int iPitch = ((4-w&3)&3);
		for( int y=0; y<ddsdDest.dwHeight; y++ )
		{
			for( int x=0; x<ddsdDest.dwWidth; x++ )
			{
				i_x = w1 + (h2-y);
				i_y = h1 + (x-w2);
				if( i_x >= 0 && i_x < W && i_y >= 0 && i_y < H )
				{
					pSrc  = p1  + (i_y*W<<1)  + (i_x<<1);
					pDest[0] = pSrc[0];
					pDest[1] = pSrc[1];
				}
				pDest += 2;
			}
			pDest += iPitch<<1;
		}
	}
	else if( ddsdSrc.ddpfPixelFormat.dwRGBBitCount == 8 )
	{
	}

	pGrDest->GetSurface()->Unlock( NULL );
	pGrSrc->GetSurface()->Unlock( NULL );

	return pGrDest;
}

cGraphics* cDirectDraw::RotateImage180( cGraphics* pGrDest, cGraphics* pGrSrc, COLORREF clrBack /* = 0 */ )
{

	DDSURFACEDESC2 ddsdSrc;
	memset( &ddsdSrc, 0, sizeof(DDSURFACEDESC2) );
	ddsdSrc.dwSize = sizeof(DDSURFACEDESC2);
	pGrSrc->GetSurface()->Lock( NULL, &ddsdSrc, DDLOCK_WAIT, NULL );
	BYTE* pSrc = static_cast<BYTE*>(ddsdSrc.lpSurface);
	BYTE* p1   = static_cast<BYTE*>(ddsdSrc.lpSurface);
	int h	   = ddsdSrc.dwHeight;
	int w	   = ddsdSrc.dwWidth;

	if( pGrDest == NULL )
	{
		pGrDest = new cGraphics();
		pGrDest->Create( w, h );
	}
	pGrDest->ColorFill( clrBack );

	DDSURFACEDESC2 ddsdDest;
	memset( &ddsdDest, 0, sizeof(DDSURFACEDESC2) );
	ddsdDest.dwSize = sizeof(DDSURFACEDESC2);
	pGrDest->GetSurface()->Lock( NULL, &ddsdDest, DDLOCK_WAIT, NULL );
	BYTE* pDest = static_cast<BYTE*>(ddsdDest.lpSurface);
	BYTE* p2    = static_cast<BYTE*>(ddsdDest.lpSurface);

	//旋转中心
	int h2 = (h>>1);
	int w2 = (w>>1);

	clrBack = RGB2GDIColor(clrBack);//
	BYTE rBack = GetRValue(clrBack);
	BYTE gBack = GetGValue(clrBack);
	BYTE bBack = GetBValue(clrBack);

	if( ddsdSrc.ddpfPixelFormat.dwRGBBitCount == 32 )
	{
		int iPitch = ((2-w&1)&1);
		pSrc = p1 + ddsdSrc.dwHeight*ddsdSrc.lPitch - ((iPitch+1)<<2);//the last Pixel
		for( int y=0; y<ddsdDest.dwHeight; y++ )
		{
			for( int x=0; x<ddsdDest.dwWidth; x++ )
			{
				pDest[0] = pSrc[0];
				pDest[1] = pSrc[1];
				pDest[2] = pSrc[2];
				pDest += 4;
				pSrc  -= 4;
			}
			pDest += iPitch<<2;
			pSrc  -= iPitch<<2;
		}
	}
	else if( ddsdSrc.ddpfPixelFormat.dwRGBBitCount == 16 )
	{
		int iPitch = ((4-w&3)&3);
		pSrc = p1 + ddsdSrc.dwHeight*ddsdSrc.lPitch - ((iPitch+1)<<1);//the last Pixel
		for( int y=0; y<ddsdDest.dwHeight; y++ )
		{
			for( int x=0; x<ddsdDest.dwWidth; x++ )
			{
				pDest[0] = pSrc[0];
				pDest[1] = pSrc[1];
				pDest += 2;
				pSrc  -= 2;
			}
			pDest += iPitch<<1;
			pSrc  -= iPitch<<1;
		}
	}
	else if( ddsdSrc.ddpfPixelFormat.dwRGBBitCount == 8 )
	{
	}

	pGrDest->GetSurface()->Unlock( NULL );
	pGrSrc->GetSurface()->Unlock( NULL );

	return pGrDest;
}

cGraphics* cDirectDraw::RotateImage270( cGraphics* pGrDest, cGraphics* pGrSrc, COLORREF clrBack /* = 0 */ )
{
	//
	DDSURFACEDESC2 ddsdSrc;
	memset( &ddsdSrc, 0, sizeof(DDSURFACEDESC2) );
	ddsdSrc.dwSize = sizeof(DDSURFACEDESC2);
	pGrSrc->GetSurface()->Lock( NULL, &ddsdSrc, DDLOCK_WAIT, NULL );
	BYTE* pSrc = static_cast<BYTE*>(ddsdSrc.lpSurface);
	BYTE* p1   = static_cast<BYTE*>(ddsdSrc.lpSurface);
	int H      = ddsdSrc.dwHeight;
	int W      = ddsdSrc.dwWidth;
	int w	   = H;
	int h	   = W;

	if( pGrDest == NULL )
	{
		pGrDest = new cGraphics();
		pGrDest->Create( w, h );
	}
	pGrDest->ColorFill( clrBack );

	DDSURFACEDESC2 ddsdDest;
	memset( &ddsdDest, 0, sizeof(DDSURFACEDESC2) );
	ddsdDest.dwSize = sizeof(DDSURFACEDESC2);
	pGrDest->GetSurface()->Lock( NULL, &ddsdDest, DDLOCK_WAIT, NULL );
	BYTE* pDest = static_cast<BYTE*>(ddsdDest.lpSurface);
	BYTE* p2    = static_cast<BYTE*>(ddsdDest.lpSurface);

	//旋转中心
	int h1 = H>>1;
	int w1 = W>>1;
	int h2 = (h>>1);
	int w2 = (w>>1);

	clrBack = RGB2GDIColor(clrBack);//
	BYTE rBack = GetRValue(clrBack);
	BYTE gBack = GetGValue(clrBack);
	BYTE bBack = GetBValue(clrBack);

	int i_x,i_y;

	if( ddsdSrc.ddpfPixelFormat.dwRGBBitCount == 32 )
	{
		int iPitch = ((2-w&1)&1);
		for( int y=0; y<ddsdDest.dwHeight; y++ )
		{
			for( int x=0; x<ddsdDest.dwWidth; x++ )
			{
				//i_x      = x1 + ( (y2-y)*sinA  + (x-x2)*cosA );
				//i_y      = y1 - ( (y2-y)*cosA  - (x-x2)*sinA );
				i_x = w1 - (h2-y);
				i_y = h1 - (x-w2);
				if( i_x >= 0 && i_x < W && i_y >= 0 && i_y < H )
				{
					pSrc  = p1  + (i_y*W<<2)  + (i_x<<2);
					pDest[0] = pSrc[0];
					pDest[1] = pSrc[1];
					pDest[2] = pSrc[2];
				}
				pDest += 4;
			}
			pDest += iPitch<<2;
		}
	}
	else if( ddsdSrc.ddpfPixelFormat.dwRGBBitCount == 16 )
	{
		int iPitch = ((4-w&3)&3);
		for( int y=0; y<ddsdDest.dwHeight; y++ )
		{
			for( int x=0; x<ddsdDest.dwWidth; x++ )
			{
				i_x = w1 - (h2-y);
				i_y = h1 - (x-w2);
				if( i_x >= 0 && i_x < W && i_y >= 0 && i_y < H )
				{
					pSrc  = p1  + (i_y*W<<1)  + (i_x<<1);
					pDest[0] = pSrc[0];
					pDest[1] = pSrc[1];

⌨️ 快捷键说明

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