2014-12-13 11:40:09 -05:00
|
|
|
#include <D3D9.h>
|
|
|
|
#include "dxwnd.h"
|
|
|
|
#include "dxwcore.hpp"
|
|
|
|
#include "dxhook.h"
|
|
|
|
#include "dxhelper.h"
|
|
|
|
#include "syslibs.h"
|
|
|
|
#include "stdio.h"
|
|
|
|
|
|
|
|
extern void TextureHandling(LPDIRECTDRAWSURFACE);
|
|
|
|
|
|
|
|
typedef HRESULT (WINAPI *LockRect_Type)(void *, UINT, D3DLOCKED_RECT *, CONST RECT *, DWORD);
|
|
|
|
typedef HRESULT (WINAPI *UnlockRect_Type)(void *, UINT);
|
|
|
|
|
2016-04-20 12:45:44 -04:00
|
|
|
extern LockRect_Type pLockRect9;
|
|
|
|
extern UnlockRect_Type pUnlockRect9;
|
2014-12-13 11:40:09 -05:00
|
|
|
|
|
|
|
extern void D3DTextureDump(D3DSURFACE_DESC, D3DLOCKED_RECT);
|
|
|
|
extern void D3DTextureHighlight(D3DSURFACE_DESC, D3DLOCKED_RECT);
|
|
|
|
extern void D3DTextureHack(D3DSURFACE_DESC, D3DLOCKED_RECT);
|
|
|
|
extern void D3DTextureTransp(D3DSURFACE_DESC, D3DLOCKED_RECT);
|
|
|
|
extern char *ExplainD3DSurfaceFormat(DWORD);
|
|
|
|
|
|
|
|
void D3D9TextureHandling(void *arg, int Level)
|
|
|
|
{
|
|
|
|
HRESULT res;
|
|
|
|
LPDIRECT3DTEXTURE9 lpd3dtex = (LPDIRECT3DTEXTURE9)arg;
|
|
|
|
IDirect3DSurface9 *pSurfaceLevel;
|
|
|
|
D3DSURFACE_DESC Desc;
|
|
|
|
D3DLOCKED_RECT LockedRect;
|
2015-12-15 11:42:37 -05:00
|
|
|
OutTraceB("D3D9TextureHandling: arg=%x level=%d\n", (DWORD)arg, Level);
|
|
|
|
// Beware: attempts to dump surfaces at level > 0 result in stack corruption!!!
|
|
|
|
if(Level > 0) return;
|
2014-12-13 11:40:09 -05:00
|
|
|
if(res=lpd3dtex->GetSurfaceLevel(Level, &pSurfaceLevel)){
|
|
|
|
OutTraceE("Texture::GetSurfaceLevel ERROR: res=%d(%s)\n", res, ExplainDDError(res));
|
|
|
|
return;
|
|
|
|
}
|
2015-05-23 12:40:49 -04:00
|
|
|
pSurfaceLevel->Release();
|
2014-12-13 11:40:09 -05:00
|
|
|
if(res=lpd3dtex->GetLevelDesc(Level, &Desc)){
|
|
|
|
OutTraceE("Texture::GetLevelDesc ERROR: res=%d(%s)\n", res, ExplainDDError(res));
|
|
|
|
return;
|
|
|
|
}
|
2017-02-02 11:50:00 -05:00
|
|
|
OutTraceB("D3D9TextureHandling: level=%d type=%x usage=%x\n", Level, Desc.Type, Desc.Usage);
|
2014-12-13 11:40:09 -05:00
|
|
|
switch(Desc.Type){
|
|
|
|
case D3DRTYPE_SURFACE:
|
|
|
|
case D3DRTYPE_TEXTURE:
|
|
|
|
break;
|
|
|
|
default:
|
2017-02-02 11:50:00 -05:00
|
|
|
OutTraceB("D3D9TextureHandling: SKIP type=%x usage=%x\n", Desc.Type);
|
2014-12-13 11:40:09 -05:00
|
|
|
return;
|
|
|
|
break;
|
|
|
|
}
|
2017-02-02 11:50:00 -05:00
|
|
|
if(Desc.Usage == D3DUSAGE_RENDERTARGET){
|
|
|
|
OutTraceB("D3D9TextureHandling: SKIP usage=%x\n", Desc.Usage);
|
|
|
|
return;
|
|
|
|
}
|
2014-12-13 11:40:09 -05:00
|
|
|
//pSurfaceLevel->GetRenderTargetData(&pRenderTarget, &pDestSurface);
|
2016-04-20 12:45:44 -04:00
|
|
|
res=(*pLockRect9)(lpd3dtex, Level, &LockedRect, NULL, D3DLOCK_READONLY);
|
2014-12-13 11:40:09 -05:00
|
|
|
OutTrace("D3D9TextureHandling: lpd3dtex=%x level=%d format=0x%x(%s) size=(%dx%d) bits=%x pitch=%d\n",
|
|
|
|
lpd3dtex, Level, Desc.Format, ExplainD3DSurfaceFormat(Desc.Format),
|
|
|
|
Desc.Width, Desc.Height, LockedRect.pBits, LockedRect.Pitch);
|
|
|
|
switch(dxw.dwFlags5 & TEXTUREMASK){
|
|
|
|
case TEXTUREHIGHLIGHT:
|
|
|
|
D3DTextureHighlight(Desc, LockedRect);
|
|
|
|
break;
|
|
|
|
case TEXTUREDUMP:
|
|
|
|
D3DTextureDump(Desc, LockedRect);
|
|
|
|
break;
|
|
|
|
case TEXTUREHACK:
|
|
|
|
D3DTextureHack(Desc, LockedRect);
|
|
|
|
break;
|
|
|
|
case TEXTURETRANSP:
|
|
|
|
D3DTextureTransp(Desc, LockedRect);
|
|
|
|
break;
|
|
|
|
}
|
2016-04-20 12:45:44 -04:00
|
|
|
res=(*pUnlockRect9)(lpd3dtex, Level);
|
2014-12-13 11:40:09 -05:00
|
|
|
}
|