6 #ifndef _INC_cDXSurface_H
7 #define _INC_cDXSurface_H
28 typedef cDXBase SUPER_t;
31 cIUnkPtr<ID3DSurface> m_pDXSurf;
36 virtual ~cDXSurface();
40 STDMETHOD_(
cString, get_Name)()
const
42 return "DXTextureSurf";
45 virtual HRESULT InitDeviceObjects(cDXDevice* pDXDev);
46 virtual HRESULT DeleteDeviceObjects();
51 HRESULT PasteFromSurface(cDXSurface* Source, cRectI* pSourceRect,
int x,
int y);
54 cDXSurface(
const cDXSurface&);
72 template< D3DFORMAT _FMT,
bool _FORCE_CLONE = false >
80 cIUnkPtr<ID3DTexture> m_pTexture;
81 cIUnkPtr<ID3DSurface> m_pSurface;
91 cIUnkPtr<ID3DSurface> m_pTmpSurface;
96 m_LockData.
pBits =
nullptr;
98 cDXSurfaceLock(
ID3DSurface* pSurf,
const cRectI* pRect, DWORD dwFlags)
103 ASSERT(m_pSurface !=
nullptr);
104 m_LockData.
pBits =
nullptr;
105 m_pSurface->GetDesc(&m_sSurfDesc);
106 Lock(pRect, dwFlags);
109 cDXSurfaceLock(
ID3DTexture* pTex,
const cRectI* pRect, DWORD dwFlags)
114 m_LockData.
pBits =
nullptr;
116 m_pSurface->GetDesc(&m_sSurfDesc);
117 Lock(pRect, dwFlags);
125 bool isLocked()
const
127 return m_LockData.
pBits !=
nullptr;
134 m_pTexture.ReleasePtr();
135 if (pSurf ==
nullptr)
139 return m_pSurface->GetDesc(&m_sSurfDesc);
145 m_pSurface.ReleasePtr();
151 HRESULT hRes = pTex->GetSurfaceLevel(iSurfaceLevel,
IUNK_GETPPTR(m_pSurface, IDirect3DSurface9));
156 return m_pSurface->GetDesc(&m_sSurfDesc);
162 m_pSurface.ReleasePtr();
163 m_pTexture.ReleasePtr();
166 HRESULT Lock(
const cRectI* pRect, DWORD dwFlags)
171 if (m_pSurface ==
nullptr)
181 m_dwLockFlags = dwFlags;
182 if (pRect ==
nullptr)
184 m_LockRect = cRectI(0, 0, m_sSurfDesc.
Width, m_sSurfDesc.
Height);
189 ASSERT(m_LockRect.left >= 0);
190 ASSERT(m_LockRect.top >= 0);
191 ASSERT(m_LockRect.right <= (
int)m_sSurfDesc.
Width);
196 if (!_FORCE_CLONE && _FMT == m_sSurfDesc.
Format)
199 if (!(m_sSurfDesc.
Usage & D3DUSAGE_DYNAMIC))
200 dwFlags &= ~D3DLOCK_DISCARD;
201 hRes = m_pSurface->LockRect(&m_LockData, (RECT*)pRect, dwFlags);
202 m_sTmpRect = cRectI(0, 0, m_sSurfDesc.
Width, m_sSurfDesc.
Height);
207 m_sTmpRect = cRectI(0, 0, m_LockRect.Width(), m_LockRect.Height());
209 cIUnkPtr<ID3DDevice> pDev;
212 hRes = pDev->CreateOffscreenPlainSurface(m_sTmpRect.right, m_sTmpRect.bottom,
216 if (!(dwFlags & D3DLOCK_DISCARD))
218 hRes = ::D3DXLoadSurfaceFromSurface(m_pTmpSurface,
nullptr, m_sTmpRect,
219 m_pSurface,
nullptr, m_LockRect, D3DX_FILTER_NONE, 0);
225 hRes = m_pTmpSurface->LockRect(&m_LockData,
nullptr, dwFlags & ~D3DLOCK_DISCARD);
234 if (m_pTmpSurface !=
nullptr)
236 m_pTmpSurface->UnlockRect();
239 HRESULT hRes = ::D3DXLoadSurfaceFromSurface(m_pSurface,
nullptr, m_LockRect,
240 m_pTmpSurface,
nullptr, m_sTmpRect, D3DX_FILTER_DITHER, 0);
243 m_pTmpSurface.ReleasePtr();
247 m_pSurface->UnlockRect();
249 m_LockData.
pBits =
nullptr;
256 return Gray3D::GetPixel<_FMT>(m_LockData, x, y);
264 x %= m_sTmpRect.right;
266 x += m_sTmpRect.right;
267 y %= m_sTmpRect.bottom;
269 y += m_sTmpRect.bottom;
275 else if (x >= m_sTmpRect.right)
276 x = m_sTmpRect.right - 1;
279 else if (y >= m_sTmpRect.bottom)
280 y = m_sTmpRect.bottom - 1;
283 return GetPixel(x, y);
286 template<
bool _BWRAP,
bool _BILERP>
D3DCOLOR GetPixelFC(
float tx,
float ty)
295 int cx = cFloat32::ifloor(tx); tx -= cx;
296 int cy = cFloat32::ifloor(ty); ty -= cy;
298 cColorf c00 = GetPixel<_BWRAP>(cx, cy);
299 cColorf c01 = GetPixel<_BWRAP>(cx + 1, cy);
300 cColorf c10 = GetPixel<_BWRAP>(cx, cy + 1);
301 cColorf c11 = GetPixel<_BWRAP>(cx + 1, cy + 1);
306 c00.DoScale(itx * ity);
307 c01.DoScale(tx * ity);
308 c10.DoScale(itx * ty);
309 c11.DoScale(tx * ty);
311 return cColorf(c00 + c01 + c10 + c11);
315 return GetPixel<_BWRAP>(cFloat32::ifloor(tx), cFloat32::ifloor(ty));
319 template<
bool _BWRAP,
bool _BILERP>
D3DCOLOR GetPixelTC(
float x,
float y)
323 float tx = x * m_sTmpRect.right;
324 float ty = y * m_sTmpRect.bottom;
325 return GetPixelFC< _BWRAP, _BILERP >(tx, ty);
#define GRAY3D_LINK
Definition: Gray3D.h:15
#define FAILED(x)
Definition: HResult.h:30
#define UNREFERENCED_PARAMETER(P)
< _WIN32 type thing. get rid of stupid warning.
Definition: SysTypes.h:299
INT32 HRESULT
_WIN32 style error codes. INT32
Definition: SysTypes.h:465
@ D3DPOOL_SCRATCH
Definition: UseDX.h:288
enum _D3DFORMAT D3DFORMAT
#define D3DLOCK_READONLY
Definition: UseDX.h:115
DWORD D3DCOLOR
Stuff normally defined in windows.h or DirectX headers.
Definition: cColorRef.h:24
#define ASSERT(exp)
Definition: cDebugAssert.h:87
#define DEBUG_CHECK(exp)
Definition: cDebugAssert.h:90
#define IUNK_GETPPTR(p, TYPE)
Definition: cIUnkPtr.h:309
Definition: IUnknown.h:68
Definition: Gray3D.cpp:12
int PIXELS_t
Count of pixels in a dimension of some image/surface.
Definition: cSurfaceInfo.h:20
char FILECHAR_t
a UTF8 char in a file name. like TCHAR
Definition: FileName.h:22
cStringT< GChar_t > cString
Definition: cString.h:636
void * pBits
Definition: UseDX.h:342
int Pitch
Definition: UseDX.h:341
DWORD Usage
Definition: UseDX.h:329
UINT Height
Definition: UseDX.h:335
D3DFORMAT Format
Definition: UseDX.h:327
UINT Width
Definition: UseDX.h:334