/* ------------------------------------------------------------------ */ // DirectDraw Surface Stack implementation /* ------------------------------------------------------------------ */ #define _CRT_SECURE_NO_WARNINGS #include #include "dxwnd.h" #include "dxwcore.hpp" //#define DXW_SURFACE_STACK_TRACING //#define OutTraceSDB OutTrace dxwSStack::dxwSStack() { lpDDSPrimary = NULL; lpDDSBackBuffer = NULL; memset(SurfaceDB, 0, sizeof(SurfaceDB)); } dxwSStack::~dxwSStack() { } static char *sRole(USHORT role) { char *s; switch (role){ case 0: s="(NULL)"; break; // should never happen ... case SURFACE_ROLE_PRIMARY: s="(PRIM)"; break; case SURFACE_ROLE_BACKBUFFER: s="(BACK)"; break; default: s="??"; break; // should never happen ... } return s; } #ifdef DXW_SURFACE_STACK_TRACING static void CheckSurfaceList(SurfaceDB_Type *SurfaceDB) { char sMsg[81]; int iPCount = 0; int iBCount = 0; for (int i=0;i 1) { sprintf(sMsg, "Primary count = %d", iPCount); MessageBox(0, sMsg, "DxWnd SurfaceList", MB_OK | MB_ICONEXCLAMATION); } if(iBCount > 1) { sprintf(sMsg, "Backbuffer count = %d", iPCount); MessageBox(0, sMsg, "DxWnd SurfaceList", MB_OK | MB_ICONEXCLAMATION); } } static void DumpSurfaceList(SurfaceDB_Type *SurfaceDB) { for (int i=0;i>> SURFACELIST CLEAR ALL\n"); #endif for (int i=0;i>> SURFACELIST UNREF: lpdds=%x%s ref=%x vers=%d\n", ps, sRole(SurfaceDB[i].uRole), SurfaceDB[i].uRef, SurfaceDB[i].uVersion); #endif SurfaceDB[i].uRef = FALSE; if(ps == lpDDSPrimary) lpDDSPrimary = GetSurfaceByRole(SURFACE_ROLE_PRIMARY); if(ps == lpDDSBackBuffer) lpDDSBackBuffer = GetSurfaceByRole(SURFACE_ROLE_BACKBUFFER); } #ifdef DXW_SURFACE_STACK_TRACING DumpSurfaceList(SurfaceDB); #endif } void dxwSStack::PushSurface(LPDIRECTDRAWSURFACE ps, USHORT role, USHORT version) { int i; SurfaceDB_Type *e; #ifdef DXW_SURFACE_STACK_TRACING OutTraceSDB(">>> SURFACELIST MARK: lpdds=%x%s vers=%d\n", ps, sRole(role), version); #endif for (i=0;ilpdds==ps) || (e->lpdds==(DWORD)0)) break; // got matching entry or end of the list } if(i == DDSQLEN) { //MessageBox(0, "Surface stack is full", "DxWnd SurfaceList", MB_OK | MB_ICONEXCLAMATION); //return; for(int j=0;jlpdds=ps; e->uRole = role; e->uRef = TRUE; e->uVersion = version; #ifdef DXW_SURFACE_STACK_TRACING DumpSurfaceList(SurfaceDB); #endif } void dxwSStack::PushPrimarySurface(LPDIRECTDRAWSURFACE ps, int version) { PushSurface(ps, SURFACE_ROLE_PRIMARY, (USHORT)version); lpDDSPrimary = ps; } void dxwSStack::PushBackBufferSurface(LPDIRECTDRAWSURFACE ps, int version) { PushSurface(ps, SURFACE_ROLE_BACKBUFFER, (USHORT)version); lpDDSBackBuffer = ps; } void dxwSStack::PopSurface(LPDIRECTDRAWSURFACE ps) { int i; // look for entry for (i=0;i>> SURFACELIST CLEAR: i=%d lpdds=%x%s ref=%x vers=%d\n", i, ps, sRole(SurfaceDB[i].uRole), SurfaceDB[i].uRef, SurfaceDB[i].uVersion); #endif for (; i