📄 core_graphics.cpp
字号:
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 + -