#define _CRT_SECURE_NO_WARNINGS #include #include #include #include "dxwnd.h" #include "dxwcore.hpp" #include "dxhook.h" #include "syslibs.h" #include "dxhelper.h" extern char *ExplainDDError(DWORD); typedef HRESULT (WINAPI *Lock_Type)(LPDIRECTDRAWSURFACE, LPRECT, LPDDSURFACEDESC, DWORD, HANDLE); typedef HRESULT (WINAPI *Unlock4_Type)(LPDIRECTDRAWSURFACE, LPRECT); typedef HRESULT (WINAPI *Unlock1_Type)(LPDIRECTDRAWSURFACE, LPVOID); extern Lock_Type pLock; extern Unlock4_Type pUnlockMethod(LPDIRECTDRAWSURFACE); extern int Set_dwSize_From_Surface(LPDIRECTDRAWSURFACE); #define GRIDSIZE 16 /* RS Hash Function */ static unsigned int Hash(BYTE *buf, int len) { unsigned int b = 378551; unsigned int a = 63689; DWORD hash = 0; for(int i = 0; i < len; i++){ hash = hash * a + buf[i]; a = a * b; } return hash; } static unsigned int HashSurface(BYTE *buf, int pitch, int width, int height) { unsigned int b = 378551; unsigned int a = 63689; DWORD hash = 0; for(int y = 0; y < height; y++){ BYTE *p = buf + (y * pitch); for(int x = 0; x < width; x++){ hash = hash * a + p[x]; a = a * b; } } return hash; } void TextureHighlight(LPDIRECTDRAWSURFACE s) { DDSURFACEDESC2 ddsd; int x, y, w, h; HRESULT res; memset(&ddsd,0,sizeof(DDSURFACEDESC2)); ddsd.dwSize = Set_dwSize_From_Surface(s); ddsd.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; if(res=(*pLock)(s, 0, (LPDDSURFACEDESC)&ddsd, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ OutTraceE("TextureHigh: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return; } extern LPDIRECTDRAWSURFACE lpDDSBack; if((ddsd.ddsCaps.dwCaps & DDSCAPS_TEXTURE) && (s != lpDDSBack)) { OutTrace("TextureHigh: lpdds=%x BitCount=%d size=(%dx%d)\n", s, ddsd.ddpfPixelFormat.dwRGBBitCount, ddsd.dwWidth, ddsd.dwHeight); w = ddsd.dwWidth; h = ddsd.dwHeight; switch (ddsd.ddpfPixelFormat.dwRGBBitCount){ case 8: { BYTE *p; BYTE color; color=(BYTE)(rand() & 0xFF); for(y=0; y> 1); for(x=0; x> 1); for(x=0; x> 2); for(x=0; x> 2); for(x=0; x scan lines from top to bottom, same as surface/texture convention for(int y=0; y<(int)ddsd.dwHeight; y++){ BYTE *p = (BYTE *)ddsd.lpSurface + (ddsd.lPitch * y); fseek(hf, hdr.bfOffBits + (iScanLineSize * y), SEEK_SET); if(fread((LPVOID)p, ddsd.lPitch, 1, hf) != 1) break; } } else { // biHeight > 0 -> scan lines from bottom to top, inverse order as surface/texture convention for(int y=0; y<(int)ddsd.dwHeight; y++){ BYTE *p = (BYTE *)ddsd.lpSurface + (ddsd.lPitch * ((ddsd.dwHeight-1) - y)); fseek(hf, hdr.bfOffBits + (iScanLineSize * y), SEEK_SET); if(fread((LPVOID)p, ddsd.lPitch, 1, hf) != 1) break; } } OutTrace("TextureHack: TEXTURE LOAD DONE\n"); break; } // Close the .BMP file. fclose(hf); break; } res=(*pUnlockMethod(s))(s, NULL); if (res) OutTraceE("TextureHack: Unlock ERROR lpdds=%x res=%x(%s) at %d\n", s, res, ExplainDDError(res), __LINE__); } void TextureHandling(LPDIRECTDRAWSURFACE s) { OutTrace("TextureHandling: dxw.dwFlags5 = %x\n", dxw.dwFlags5 & (TEXTUREHIGHLIGHT|TEXTUREDUMP|TEXTUREHACK)); switch(dxw.dwFlags5 & (TEXTUREHIGHLIGHT|TEXTUREDUMP|TEXTUREHACK)){ default: case TEXTUREHIGHLIGHT: TextureHighlight(s); break; case TEXTUREDUMP: TextureDump(s); break; case TEXTUREHACK: TextureHack(s); break; } }