120 lines
2.7 KiB
C++
120 lines
2.7 KiB
C++
// ************************************************************************************************
|
|
//
|
|
// Direct Video
|
|
//
|
|
//
|
|
// ************************************** (c) Pedro Díez López ************************************
|
|
|
|
#include <malloc.h>
|
|
#include "DXVideo.h"
|
|
//
|
|
// Inicio
|
|
//
|
|
BOOL CDXVideo::Inicio(HWND hwnd,int Ancho,int Alto,int BPP)
|
|
{
|
|
char buf[256];
|
|
|
|
ddrval = DirectDrawCreate(NULL, &lpDD, NULL);
|
|
|
|
if(ddrval == DD_OK)
|
|
{
|
|
ddrval = lpDD->SetCooperativeLevel(hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
|
|
if(ddrval == DD_OK)
|
|
{
|
|
ddrval = lpDD->SetDisplayMode(Ancho,Alto,BPP);
|
|
if(ddrval == DD_OK)
|
|
{
|
|
ddsd.dwSize = sizeof(ddsd);
|
|
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
|
|
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
|
|
ddsd.dwBackBufferCount = 1;
|
|
ddrval = lpDD->CreateSurface(&ddsd, &lpDDSView, NULL);
|
|
if(ddrval == DD_OK)
|
|
{
|
|
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
|
|
ddrval = lpDDSView->GetAttachedSurface(&ddscaps, &lpDDSBack);
|
|
if(ddrval == DD_OK)
|
|
{
|
|
hres = Ancho;
|
|
vres = Alto;
|
|
bpp = BPP;
|
|
ElmBuffer = hres*vres;
|
|
DimBuffer = hres*vres*(bpp/8);
|
|
pBuffer.bpp = malloc (DimBuffer);
|
|
if(pBuffer.bpp==NULL)
|
|
{
|
|
hres = 0;
|
|
vres = 0;
|
|
bpp = 0;
|
|
ElmBuffer = 0;
|
|
DimBuffer = 0;
|
|
Fin();
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
wsprintf(buf, "Fallo %08lX al iniciliazr DirectDraw\n",ddrval);
|
|
MessageBox(hwnd, buf, "ERROR DirectX", MB_OK);
|
|
Fin();
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// Cursor
|
|
//
|
|
void CDXVideo::Cursor(HCURSOR nCursor)
|
|
{
|
|
mDDCursorShape = nCursor;
|
|
}
|
|
|
|
//
|
|
// Pinta
|
|
//
|
|
void CDXVideo::Pinta ()
|
|
{
|
|
// Copia el buffer de trabajo al BackBuffer.
|
|
while (TRUE)
|
|
{
|
|
ddrval=lpDDSBack->Lock(NULL,&ddsd,0,NULL);
|
|
if(ddrval == DD_OK) break;
|
|
if (ddrval != DDERR_WASSTILLDRAWING) return;
|
|
}
|
|
lpDXBuffer = (void *)ddsd.lpSurface;
|
|
memcpy(lpDXBuffer,pBuffer.bpp,DimBuffer);
|
|
lpDDSBack->Unlock(NULL);
|
|
// Cambia el buffer.
|
|
while (TRUE)
|
|
{
|
|
ddrval=lpDDSView->Flip(NULL, 0);
|
|
if (ddrval == DD_OK) return;
|
|
if (ddrval == DDERR_SURFACELOST)
|
|
{
|
|
ddrval=lpDDSView->Restore();
|
|
if (ddrval!=DD_OK) return;
|
|
}
|
|
if (ddrval!=DDERR_WASSTILLDRAWING) return;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Fin
|
|
//
|
|
void CDXVideo::Fin()
|
|
{
|
|
if (pBuffer.bpp != NULL) free (pBuffer.bpp);
|
|
if(lpDD != NULL)
|
|
{
|
|
if(lpDDSView!=NULL)
|
|
{
|
|
lpDDSView->Release();
|
|
lpDDSView = NULL;
|
|
}
|
|
lpDD->Release();
|
|
lpDD = NULL;
|
|
}
|
|
}
|