DX7 mi je znacajan zato sto podrzava kombinovanje DDrawa i D3D-a, sto sa DX8 i 9 nije moguce (bar koliko sam ja video). Uostalom, tu imam sve sto mi treba tako da drugi API za sada nije potreban.
Ova funkcija vraca alpha surface kao teksturu kombinacijom RGB i alpha (crno-bele) slike. Kao ulaz prihvata imena fajlova od kojih pravi surface i zatim kreira 32-bitnu alpha teksturu i upisuje u nju informarcije iz datih fajlova.
Kod nije koristan za DX8 i veci jer ovi vec imaju ugradjene funkcije za kreiranje alpha tekstura, ali ko zeli da korirsti DX7 (zbog sire kompatibilnosti, mogucnosti kombinacije sa DDraw-om itd) onda ce mu svakako koristiti.
Code:
IDirectDrawSurface7 *CreateAlphaTexture(char *image, char *mask)
{
DDSURFACEDESC2 Desc,Dimage,Dalpha;
int x,y;
DWORD *ColorB,*AlphaB,*FinalB;
IDirectDrawSurface7 *AlphaSurface, *ImageSurface, *TheSurface;
if ((ImageSurface=LoadBitmapSurface(image,FALSE))==NULL)
{
return NULL;
}
if ((AlphaSurface=LoadBitmapSurface(mask,FALSE))==NULL)
{
SafeRelease(ImageSurface);
return NULL;
}
ZeroMemory( &Dimage, sizeof( DDSURFACEDESC2 ));
Dimage.dwSize = sizeof( Dimage );
ZeroMemory( &Dalpha, sizeof( DDSURFACEDESC2 ));
Dalpha.dwSize = sizeof( Dalpha );
ImageSurface->GetSurfaceDesc(&Dimage);
AlphaSurface->GetSurfaceDesc(&Dalpha);
if (Dimage.dwWidth!=Dalpha.dwWidth ||
Dimage.dwHeight!=Dalpha.dwHeight)
{
ShowMessage("error","Alpha and Base Texture Height and Width
are not Equal");
SafeRelease(AlphaSurface);
SafeRelease(ImageSurface);
return NULL;
}
ZeroMemory( &Desc, sizeof( DDSURFACEDESC2 ));
Desc.dwSize = sizeof( Desc );
Desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS | DDSD_PIXELFORMAT;
Desc.ddpfPixelFormat.dwFlags=DDPF_RGB | DDPF_ALPHAPIXELS;
Desc.ddpfPixelFormat.dwRGBBitCount = 32;
Desc.ddpfPixelFormat.dwRGBAlphaBitMask = 0xFF000000;
Desc.ddpfPixelFormat.dwRBitMask = 0xFF0000;
Desc.ddpfPixelFormat.dwGBitMask = 0xFF00;
Desc.ddpfPixelFormat.dwBBitMask = 0xFF;
Desc.dwWidth = Dimage.dwWidth;
Desc.dwHeight = Dimage.dwHeight;
Desc.ddsCaps.dwCaps = DDSCAPS_TEXTURE;
Desc.ddsCaps.dwCaps2 = DDSCAPS2_TEXTUREMANAGE;
lpDD->CreateSurface( &Desc, &TheSurface, 0 );
if (TheSurface==NULL)
{
ShowMessage("error","Failed to create alpha surface for %s",image);
SafeRelease(AlphaSurface);
SafeRelease(ImageSurface);
return NULL;
}
ZeroMemory( &Dimage, sizeof( DDSURFACEDESC2 ));
Dimage.dwSize = sizeof( Dimage );
ZeroMemory( &Dalpha, sizeof( DDSURFACEDESC2 ));
Dalpha.dwSize = sizeof( Dalpha );
ZeroMemory( &Desc, sizeof( DDSURFACEDESC2 ));
Desc.dwSize = sizeof( Desc );
ImageSurface->Lock( NULL, &Dimage, DDLOCK_WAIT, NULL );
AlphaSurface->Lock( NULL, &Dalpha, DDLOCK_WAIT, NULL );
TheSurface->Lock( NULL, &Desc, DDLOCK_WAIT, NULL );
DWORD ColorRGBMask = ( DWORD )( Dimage.ddpfPixelFormat.dwRBitMask |
Dimage.ddpfPixelFormat.dwGBitMask |
Dimage.ddpfPixelFormat.dwBBitMask );
for (y=0;y<Desc.dwHeight;y++)
{
ColorB = (DWORD*)(( BYTE* )Dimage.lpSurface + y * Dimage.lPitch);
AlphaB = (DWORD*)(( BYTE* )Dalpha.lpSurface + y * Dalpha.lPitch);
FinalB = (DWORD*)(( BYTE* )Desc.lpSurface + y * Desc.lPitch);
for (x=0;x<Desc.dwWidth;x++)
{
*FinalB|=((*AlphaB & Dalpha.ddpfPixelFormat.dwRBitMask)*0x100) &
Desc.ddpfPixelFormat.dwRGBAlphaBitMask;
*FinalB|=*ColorB & ColorRGBMask;
*FinalB++;
*ColorB++;
*AlphaB++;
}
}
TheSurface->Unlock( NULL );
AlphaSurface->Unlock( NULL );
ImageSurface->Unlock( NULL );
SafeRelease(AlphaSurface);
SafeRelease(ImageSurface);
return TheSurface;
}
Sasa
Life happens but shit goes on