/* ------------------------------------------------------------------ */
// DirectDraw Objects capability DB
/* ------------------------------------------------------------------ */

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include "dxwnd.h"
#include "dxwcore.hpp"

//#define DXW_SURFACE_STACK_TRACING
//#define OutTraceSDB OutTrace

dxwCapsDB::dxwCapsDB()
{
	memset(CapsDB, 0, sizeof(CapsDB));
}

dxwCapsDB::~dxwCapsDB()
{
}

void dxwCapsDB::PushCaps(LPDIRECTDRAWSURFACE ps, DWORD dwCaps)
{
	int i;
	CapsDB_Type *e;
#ifdef DXW_SURFACE_STACK_TRACING
	OutTraceSDB(">>> CAPSDB MARK: lpdds=%x%s caps=%x(%s)\n", ps, dwCaps, ExplainDDCaps(dwCaps));
#endif
	for (i=0;i<DDSQLEN;i++) {
		e=&CapsDB[i];
		if ((e->lpdds==ps) || (e->lpdds==(DWORD)0)) break; // got matching entry or end of the list
	}
	if(i == DDSQLEN) {
		//MessageBox(0, "Caps stack is full", "DxWnd SurfaceList", MB_OK | MB_ICONEXCLAMATION);
		//return;
		for(int j=0;j<DDSQLEN-1;j++) CapsDB[j]=CapsDB[j+1]; // scale down the whole stack one entry
		e=&CapsDB[DDSQLEN-1];
	}
	e->lpdds=ps;
	e->dwCaps = dwCaps;
}
	
DWORD dxwCapsDB::GetCaps(LPDIRECTDRAWSURFACE ps)
{
	int i;
	// look for entry
	for (i=0;i<DDSQLEN;i++) {
		if (CapsDB[i].lpdds==0) return 0;
		if (CapsDB[i].lpdds==ps) break; 
	}
	// if found, delete it by left-copying each entry until end of array
	if (CapsDB[i].lpdds==ps){
#ifdef DXW_SURFACE_STACK_TRACING
		OutTraceSDB(">>> CAPSDB GETCAPS: i=%d lpdds=%x caps=%x(%s)\n", 
			i, ps, CapsDB[i].dwCaps, ExplainDDCaps(CapsDB[i].dwCaps));
#endif
		return CapsDB[i].dwCaps;
	}
	return 0;
}