573 lines
21 KiB
C
573 lines
21 KiB
C
|
/*==========================================================================
|
||
|
*
|
||
|
* Copyright (C) 1997 Microsoft Corporation. All Rights Reserved.
|
||
|
*
|
||
|
* File: ddfactry.h
|
||
|
* Content: DirectDraw factory class header
|
||
|
* includes defns for CDDFactory, CDirectDrawEx,
|
||
|
* and CDDSurface
|
||
|
* History:
|
||
|
* Date By Reason
|
||
|
* ==== == ======
|
||
|
* 24-feb-97 ralphl initial implementation
|
||
|
* 25-feb-97 craige minor tweaks for dx checkin; integrated IBitmapSurface
|
||
|
* stuff
|
||
|
* 03-mar-97 craige added IRGBColorTable support
|
||
|
* 06-mar-97 craige IDirectDrawSurface3 support
|
||
|
* 14-mar-97 jeffort SetBits changed to reflect DX5 as SetSurfaceDesc
|
||
|
* 01-apr-97 jeffort Following changes checked in:
|
||
|
* D3D Interface support
|
||
|
* Linked list of surfaces real/internal interfaces kept
|
||
|
* Complex surface/Attach list handleing
|
||
|
* Handle for palettes added
|
||
|
* Add/GetAttachedSurface, Flip, and Blit are aggregated
|
||
|
*
|
||
|
* 04-apr-97 jeffort TRIDENT ifdef's removed.
|
||
|
* IDirectDraw3 Class implementation
|
||
|
* 09-apr-97 jeffort Added #defines for version and member function for OWNDC stuff
|
||
|
* 28-apr-97 jeffort Palette wrapping added/DX5 support
|
||
|
* 02-may-97 jeffort Removed commented code, added GetDDInterface function wrapping
|
||
|
* 06-may-97 jeffort DeleteAttachedSurface wrapping added
|
||
|
* 20-may-97 jeffort Added fields in surface object for NT4.0 gold
|
||
|
* 02-jul-97 jeffort Added m_bSaveDC boolean if a DX5 surface with OWNDC set
|
||
|
* we need to not NULL out the DC when ReleaseDC is called
|
||
|
* so that a call to GetSurfaceFromDC will work
|
||
|
* 07-jul-97 jeffort Added GetSurfaceDesc internal function for wrapping
|
||
|
* 10-jul-97 jeffort Added m_hBMOld to store old bitmap handle to reset at destruction
|
||
|
* 18-jul-97 jeffort Added D3D MMX Device support
|
||
|
* 22-jul-97 jeffort Removed IBitmapSurface and associated interfaces
|
||
|
* 02-aug-97 jeffort New structure added to surface object to store attached
|
||
|
* surfaces created with a different ddrawex object
|
||
|
* 20-feb-98 stevela Added Chrome rasterizers
|
||
|
***************************************************************************/
|
||
|
#undef WIN32_LEAN_AND_MEAN
|
||
|
#define WIN32_LEAN_AND_MEAN
|
||
|
#include <windows.h>
|
||
|
#include "crtfree.h"
|
||
|
#include "ddraw.h"
|
||
|
#include "d3d.h"
|
||
|
#include "ddrawex.h"
|
||
|
#include "ddraw3i.h"
|
||
|
#include "comdll.h"
|
||
|
#ifdef INITGUID
|
||
|
#include <initguid.h>
|
||
|
#endif
|
||
|
|
||
|
/*
|
||
|
* reminder
|
||
|
*/
|
||
|
#define QUOTE(x) #x
|
||
|
#define QQUOTE(y) QUOTE(y)
|
||
|
#define REMIND(str) __FILE__ "(" QQUOTE(__LINE__) "):" str
|
||
|
|
||
|
#ifndef ARRAYSIZE
|
||
|
#define ARRAYSIZE(x) (sizeof(x) / sizeof((x)[0]))
|
||
|
#endif
|
||
|
|
||
|
class CDirectDrawEx;
|
||
|
class CDDSurface;
|
||
|
class CDDPalette;
|
||
|
|
||
|
#ifndef CINTERFACE
|
||
|
#define IDirectDrawVtbl void
|
||
|
#define IDirectDraw2Vtbl void
|
||
|
#define IDirectDraw4Vtbl void
|
||
|
#define IDirectDrawSurfaceVtbl void
|
||
|
#define IDirectDrawSurface2Vtbl void
|
||
|
#define IDirectDrawSurface3Vtbl void
|
||
|
#define IDirectDrawPaletteVtbl void
|
||
|
#define IDirectDrawSurface4Vtbl void
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#ifndef DIRECTDRAW_VERSION
|
||
|
//these are not included in DX3 include files, define them here
|
||
|
DEFINE_GUID( IID_IDirect3DRampDevice, 0xF2086B20,0x259F,0x11CF,0xA3,0x1A,0x00,0xAA,0x00,0xB9,0x33,0x56 );
|
||
|
DEFINE_GUID( IID_IDirect3DRGBDevice, 0xA4665C60,0x2673,0x11CF,0xA3,0x1A,0x00,0xAA,0x00,0xB9,0x33,0x56 );
|
||
|
DEFINE_GUID( IID_IDirect3DHALDevice, 0x84E63dE0,0x46AA,0x11CF,0x81,0x6F,0x00,0x00,0xC0,0x20,0x15,0x6E );
|
||
|
DEFINE_GUID( IID_IDirect3DMMXDevice, 0x881949a1,0xd6f3,0x11d0,0x89,0xab,0x00,0xa0,0xc9,0x05,0x41,0x29 );
|
||
|
DEFINE_GUID( IID_IDirect3DChrmDevice, 0x2f4d2045,0x9764,0x11d1,0x91,0xf2,0x0,0x0,0xf8,0x75,0x8e,0x66 );
|
||
|
#endif
|
||
|
|
||
|
#ifndef IID_IDirect3DChrmDevice
|
||
|
DEFINE_GUID( IID_IDirect3DChrmDevice, 0x2f4d2045,0x9764,0x11d1,0x91,0xf2,0x0,0x0,0xf8,0x75,0x8e,0x66 );
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#define SURFACE_DATAEXCHANGE 0x00000001
|
||
|
|
||
|
//defines for our version information
|
||
|
#define WIN95_DX2 0x00000001
|
||
|
#define WIN95_DX3 0x00000002
|
||
|
#define WIN95_DX5 0x00000003
|
||
|
#define WINNT_DX2 0x00000004
|
||
|
#define WINNT_DX3 0x00000005
|
||
|
#define WINNT_DX5 0x00000006
|
||
|
|
||
|
extern "C" {
|
||
|
void WINAPI AcquireDDThreadLock(void);
|
||
|
void WINAPI ReleaseDDThreadLock(void);
|
||
|
};
|
||
|
|
||
|
#define ENTER_DDEX() AcquireDDThreadLock();
|
||
|
#define LEAVE_DDEX() ReleaseDDThreadLock();
|
||
|
|
||
|
/*
|
||
|
* ddraw's internal interface structure
|
||
|
*/
|
||
|
typedef struct _REALDDINTSTRUC
|
||
|
{
|
||
|
void *lpVtbl;
|
||
|
void *pDDInternal1;
|
||
|
void *pDDInternal2;
|
||
|
void *pDDInternal3;
|
||
|
} REALDDINTSTRUC;
|
||
|
|
||
|
/*
|
||
|
* Our version of the IDirectDraw interface internal structure
|
||
|
*/
|
||
|
typedef struct _DDINTSTRUC
|
||
|
{
|
||
|
IDirectDrawVtbl *lpVtbl;
|
||
|
void *pDDInternal1;
|
||
|
void *pDDInternal2;
|
||
|
void *pDDInternal3;
|
||
|
// ONLY ADD STUFF AFTER THESE 4 ENTRIES!!!
|
||
|
CDirectDrawEx *m_pDirectDrawEx;
|
||
|
IDirectDraw *m_pRealInterface;
|
||
|
} INTSTRUC_IDirectDraw;
|
||
|
|
||
|
/*
|
||
|
* Our version of the IDirectDraw2 interface internal structure
|
||
|
*/
|
||
|
typedef struct _DD2INTSTRUC
|
||
|
{
|
||
|
IDirectDraw2Vtbl *lpVtbl;
|
||
|
void *pDDInternal1;
|
||
|
void *pDDInternal2;
|
||
|
void *pDDInternal3;
|
||
|
// ONLY ADD STUFF AFTER THESE 4 ENTRIES!!!
|
||
|
CDirectDrawEx *m_pDirectDrawEx;
|
||
|
IDirectDraw2 *m_pRealInterface;
|
||
|
} INTSTRUC_IDirectDraw2;
|
||
|
|
||
|
typedef struct _DD4INTSTRUC
|
||
|
{
|
||
|
IDirectDraw4Vtbl *lpVtbl;
|
||
|
void *pDDInternal1;
|
||
|
void *pDDInternal2;
|
||
|
void *pDDInternal3;
|
||
|
// ONLY ADD STUFF AFTER THESE 4 ENTRIES!!!
|
||
|
CDirectDrawEx *m_pDirectDrawEx;
|
||
|
IDirectDraw4 *m_pRealInterface;
|
||
|
} INTSTRUC_IDirectDraw4;
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Our version of the IDirectDrawSurface interface internal structure
|
||
|
*/
|
||
|
typedef struct _DDSURFINTSTRUC
|
||
|
{
|
||
|
IDirectDrawSurfaceVtbl *lpVtbl;
|
||
|
void *pDDInternal1;
|
||
|
void *pDDInternal2;
|
||
|
void *pDDInternal3;
|
||
|
// ONLY ADD STUFF AFTER THESE 4 ENTRIES!!!
|
||
|
CDDSurface *m_pSimpleSurface;
|
||
|
IDirectDrawSurface *m_pRealInterface;
|
||
|
} INTSTRUC_IDirectDrawSurface;
|
||
|
|
||
|
/*
|
||
|
* Our version of the IDirectDrawSurface2 interface internal structure
|
||
|
*/
|
||
|
typedef struct _DDSURF2INTSTRUC
|
||
|
{
|
||
|
IDirectDrawSurface2Vtbl *lpVtbl;
|
||
|
void *pDDInternal1;
|
||
|
void *pDDInternal2;
|
||
|
void *pDDInternal3;
|
||
|
// ONLY ADD STUFF AFTER THESE 4 ENTRIES!!!
|
||
|
CDDSurface *m_pSimpleSurface;
|
||
|
IDirectDrawSurface2 *m_pRealInterface;
|
||
|
} INTSTRUC_IDirectDrawSurface2;
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Our version of the IDirectDrawSurface3 interface internal structure
|
||
|
*/
|
||
|
typedef struct _DDSURF3INTSTRUC
|
||
|
{
|
||
|
IDirectDrawSurface3Vtbl *lpVtbl;
|
||
|
void *pDDInternal1;
|
||
|
void *pDDInternal2;
|
||
|
void *pDDInternal3;
|
||
|
// ONLY ADD STUFF AFTER THESE 4 ENTRIES!!!
|
||
|
CDDSurface *m_pSimpleSurface;
|
||
|
IDirectDrawSurface3 *m_pRealInterface;
|
||
|
} INTSTRUC_IDirectDrawSurface3;
|
||
|
|
||
|
|
||
|
typedef struct _DDSURF4INTSTRUC
|
||
|
{
|
||
|
IDirectDrawSurface4Vtbl *lpVtbl;
|
||
|
void *pDDInternal1;
|
||
|
void *pDDInternal2;
|
||
|
void *pDDInternal3;
|
||
|
// ONLY ADD STUFF AFTER THESE 4 ENTRIES!!!
|
||
|
CDDSurface *m_pSimpleSurface;
|
||
|
IDirectDrawSurface4 *m_pRealInterface;
|
||
|
} INTSTRUC_IDirectDrawSurface4;
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Our version of IDirectDrawPalette interface internal structure
|
||
|
*/
|
||
|
|
||
|
typedef struct _DDPALINTSTRUC
|
||
|
{
|
||
|
IDirectDrawPaletteVtbl *lpVtbl;
|
||
|
void *pDDInternal1;
|
||
|
void *pDDInternal2;
|
||
|
void *pDDInternal3;
|
||
|
CDDPalette *m_pSimplePalette;
|
||
|
IDirectDrawPalette *m_pRealInterface;
|
||
|
} INTSTRUC_IDirectDrawPalette;
|
||
|
|
||
|
|
||
|
typedef struct tagDDAttachSurface
|
||
|
{
|
||
|
CDDSurface * pSurface;
|
||
|
struct tagDDAttachSurface * pNext;
|
||
|
}DDAttachSurface;
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Non Delegating IUnknown interface
|
||
|
*/
|
||
|
interface INonDelegatingUnknown
|
||
|
{
|
||
|
virtual STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv) = 0;
|
||
|
virtual STDMETHODIMP_(ULONG) NonDelegatingAddRef(void) = 0;
|
||
|
virtual STDMETHODIMP_(ULONG) NonDelegatingRelease(void) = 0;
|
||
|
};
|
||
|
|
||
|
|
||
|
#pragma warning (disable:4355)
|
||
|
#define CAST_TO_IUNKNOWN(object) (reinterpret_cast<IUnknown *>(static_cast<INonDelegatingUnknown *>(object)))
|
||
|
|
||
|
typedef HRESULT (WINAPI *LPDIRECTDRAWCREATE)( GUID FAR *lpGUID, LPDIRECTDRAW FAR *lplpDD, IUnknown FAR *pUnkOuter );
|
||
|
typedef HRESULT (WINAPI *LPDIRECTDRAWENUMW)( LPDDENUMCALLBACKW lpCallback, LPVOID lpContext );
|
||
|
typedef HRESULT (WINAPI *LPDIRECTDRAWENUMA)( LPDDENUMCALLBACKA lpCallback, LPVOID lpContext );
|
||
|
|
||
|
/*
|
||
|
* DDFactor class definition
|
||
|
*/
|
||
|
class CDDFactory : public INonDelegatingUnknown, public IDirectDrawFactory
|
||
|
{
|
||
|
public:
|
||
|
// Non-Delegating versions of IUnknown
|
||
|
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv);
|
||
|
STDMETHODIMP_(ULONG) NonDelegatingAddRef(void);
|
||
|
STDMETHODIMP_(ULONG) NonDelegatingRelease(void);
|
||
|
|
||
|
// IUnknown
|
||
|
STDMETHODIMP QueryInterface(REFIID riid, void **ppv);
|
||
|
STDMETHODIMP_(ULONG) AddRef(void);
|
||
|
STDMETHODIMP_(ULONG) Release(void);
|
||
|
|
||
|
// IDirectDrawFactory
|
||
|
STDMETHODIMP CreateDirectDraw(GUID * pGUID, HWND hWnd, DWORD dwCoopLevelFlags, DWORD dwReserved, IUnknown *pUnkOuter, IDirectDraw **ppDirectDraw);
|
||
|
STDMETHODIMP DirectDrawEnumerate(LPDDENUMCALLBACK lpCallback, LPVOID lpContext);
|
||
|
|
||
|
CDDFactory(IUnknown *pUnkOuter);
|
||
|
|
||
|
public:
|
||
|
LONG m_cRef;
|
||
|
IUnknown *m_pUnkOuter;
|
||
|
HANDLE m_hDDrawDLL;
|
||
|
DWORD m_dwDDVerMS;
|
||
|
LPDIRECTDRAWCREATE m_pDirectDrawCreate;
|
||
|
LPDIRECTDRAWENUMW m_pDirectDrawEnumerateW;
|
||
|
LPDIRECTDRAWENUMA m_pDirectDrawEnumerateA;
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* DirectDrawEx class definition
|
||
|
*/
|
||
|
|
||
|
class CDirectDrawEx : public INonDelegatingUnknown, public IDirectDraw3
|
||
|
{
|
||
|
public:
|
||
|
// Non-Delegating versions of IUnknown
|
||
|
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv);
|
||
|
STDMETHODIMP_(ULONG) NonDelegatingAddRef(void);
|
||
|
STDMETHODIMP_(ULONG) NonDelegatingRelease(void);
|
||
|
|
||
|
// IUnknown
|
||
|
STDMETHODIMP QueryInterface(REFIID riid, void **ppv);
|
||
|
STDMETHODIMP_(ULONG) AddRef(void);
|
||
|
STDMETHODIMP_(ULONG) Release(void);
|
||
|
|
||
|
|
||
|
// IDirectDraw3
|
||
|
STDMETHODIMP Compact();
|
||
|
STDMETHODIMP CreateClipper(DWORD, LPDIRECTDRAWCLIPPER FAR*, IUnknown FAR * );
|
||
|
STDMETHODIMP DuplicateSurface(LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE FAR * );
|
||
|
STDMETHODIMP EnumDisplayModes(DWORD, LPDDSURFACEDESC, LPVOID, LPDDENUMMODESCALLBACK );
|
||
|
STDMETHODIMP EnumSurfaces(DWORD, LPDDSURFACEDESC, LPVOID,LPDDENUMSURFACESCALLBACK );
|
||
|
STDMETHODIMP FlipToGDISurface();
|
||
|
STDMETHODIMP GetCaps(LPDDCAPS, LPDDCAPS);
|
||
|
STDMETHODIMP GetDisplayMode(LPDDSURFACEDESC);
|
||
|
STDMETHODIMP GetFourCCCodes(LPDWORD, LPDWORD );
|
||
|
STDMETHODIMP GetGDISurface(LPDIRECTDRAWSURFACE FAR *);
|
||
|
STDMETHODIMP GetMonitorFrequency(LPDWORD);
|
||
|
STDMETHODIMP GetScanLine(LPDWORD);
|
||
|
STDMETHODIMP GetVerticalBlankStatus(LPBOOL );
|
||
|
STDMETHODIMP Initialize(GUID FAR *);
|
||
|
STDMETHODIMP RestoreDisplayMode();
|
||
|
STDMETHODIMP SetDisplayMode(DWORD, DWORD,DWORD, DWORD, DWORD);
|
||
|
STDMETHODIMP WaitForVerticalBlank(DWORD, HANDLE );
|
||
|
STDMETHODIMP GetAvailableVidMem(LPDDSCAPS, LPDWORD, LPDWORD);
|
||
|
STDMETHODIMP GetSurfaceFromDC(HDC, IDirectDrawSurface **);
|
||
|
|
||
|
|
||
|
// Internal goop
|
||
|
CDirectDrawEx(IUnknown *pUnkOuter);
|
||
|
~CDirectDrawEx();
|
||
|
HRESULT Init(GUID * pGUID, HWND hWnd, DWORD dwCoopLevelFlags, DWORD dwReserved, LPDIRECTDRAWCREATE pDirectDrawCreate );
|
||
|
STDMETHODIMP CreateSurface(LPDDSURFACEDESC pSurfaceDesc, IDirectDrawSurface **ppNewSurface, IUnknown *pUnkOuter);
|
||
|
STDMETHODIMP CreateSurface(LPDDSURFACEDESC2 pSurfaceDesc, IDirectDrawSurface4 **ppNewSurface4, IUnknown *pUnkOuter);
|
||
|
STDMETHODIMP CreatePalette(DWORD dwFlags, LPPALETTEENTRY pEntries, LPDIRECTDRAWPALETTE FAR * ppPal, IUnknown FAR * pUnkOuter);
|
||
|
STDMETHODIMP SetCooperativeLevel(HWND hwnd, DWORD dwFlags);
|
||
|
|
||
|
|
||
|
void AddSurfaceToList(CDDSurface *pSurface);
|
||
|
void RemoveSurfaceFromList(CDDSurface *pSurface);
|
||
|
void AddSurfaceToPrimaryList(CDDSurface *pSurface);
|
||
|
void RemoveSurfaceFromPrimaryList(CDDSurface *pSurface);
|
||
|
void AddPaletteToList(CDDPalette *pPalette);
|
||
|
void RemovePaletteFromList(CDDPalette *pPalette);
|
||
|
HRESULT HandleAttachList(LPDDSURFACEDESC pSurfaceDesc, IUnknown *pUnkOuter,IDirectDrawSurface **ppNewSurface, IDirectDrawSurface * pOrigSurf, DWORD dwFlags);
|
||
|
HRESULT CreateSimpleSurface(LPDDSURFACEDESC pSurfaceDesc, IUnknown *pUnkOuter, IDirectDrawSurface * pSurface, IDirectDrawSurface **ppNewSurface, DWORD dwFlags);
|
||
|
public:
|
||
|
INTSTRUC_IDirectDraw m_DDInt;
|
||
|
INTSTRUC_IDirectDraw2 m_DD2Int;
|
||
|
INTSTRUC_IDirectDraw4 m_DD4Int;
|
||
|
|
||
|
LONG m_cRef;
|
||
|
IUnknown *m_pUnkOuter;
|
||
|
CDDSurface *m_pFirstSurface; // list of surfaces (NOT ADDREF'd!)
|
||
|
CDDSurface *m_pPrimaryPaletteList;
|
||
|
CDDPalette *m_pFirstPalette;
|
||
|
BOOL m_bExclusive;
|
||
|
DWORD m_dwDDVer;
|
||
|
};
|
||
|
|
||
|
|
||
|
/*
|
||
|
* DirectDraw simple surface class definition
|
||
|
*/
|
||
|
|
||
|
class CDDSurface : public INonDelegatingUnknown
|
||
|
{
|
||
|
friend CDirectDrawEx;
|
||
|
|
||
|
public:
|
||
|
CDDSurface *m_pPrev; // Used by DirectDrawEx to insert in list
|
||
|
CDDSurface *m_pNext;
|
||
|
CDDSurface *m_pPrevPalette;
|
||
|
CDDSurface *m_pNextPalette;
|
||
|
CDDSurface *m_pDestroyList;
|
||
|
CDDPalette *m_pCurrentPalette;
|
||
|
IUnknown *m_pUnkOuter;
|
||
|
//this member will be a linked list of explicitly attached surfaces
|
||
|
//that were not created with the same ddrawex object that this surface
|
||
|
//was created with
|
||
|
DDAttachSurface *m_pAttach;
|
||
|
LONG m_cRef;
|
||
|
CDirectDrawEx *m_pDirectDrawEx;
|
||
|
INTSTRUC_IDirectDrawSurface m_DDSInt;
|
||
|
INTSTRUC_IDirectDrawSurface2 m_DDS2Int;
|
||
|
INTSTRUC_IDirectDrawSurface3 m_DDS3Int;
|
||
|
INTSTRUC_IDirectDrawSurface4 m_DDS4Int;
|
||
|
IDirect3DDevice * m_D3DDeviceRAMPInt;
|
||
|
IDirect3DDevice * m_D3DDeviceHALInt;
|
||
|
IDirect3DDevice * m_D3DDeviceRGBInt;
|
||
|
IDirect3DDevice * m_D3DDeviceChrmInt;
|
||
|
IDirect3DDevice * m_D3DDeviceMMXInt;
|
||
|
IDirect3DTexture * m_D3DTextureInt;
|
||
|
HDC m_HDC;
|
||
|
DWORD m_dwCaps;
|
||
|
HDC m_hDCDib;
|
||
|
HBITMAP m_hBMDib;
|
||
|
HBITMAP m_hBMOld;
|
||
|
LPVOID m_pBitsDib;
|
||
|
IDirectDrawPalette *m_pDDPal;
|
||
|
IDirectDrawPalette *m_pDDPalOurs;
|
||
|
WORD m_dwPalSize;
|
||
|
WORD m_dwPalEntries;
|
||
|
BOOL m_bOwnDC; //boolean set if we are spoofing ddraw to support owndc
|
||
|
BOOL m_bSaveDC;//boolean to store if DX5 and OWNDC set
|
||
|
BOOL m_bPrimaryPalette;
|
||
|
BOOL m_bIsPrimary;
|
||
|
ULONG_PTR m_pSaveBits;
|
||
|
DWORD m_pSaveHDC;
|
||
|
#ifdef DEBUG
|
||
|
DWORD m_DebugCheckDC;
|
||
|
#endif
|
||
|
DWORD m_pSaveHBM;
|
||
|
|
||
|
public:
|
||
|
CDDSurface( DDSURFACEDESC *pSurfaceDesc,
|
||
|
IDirectDrawSurface *pDDSurface,
|
||
|
IDirectDrawSurface2 *pDDSurface2,
|
||
|
IDirectDrawSurface3 *pDDSurface3,
|
||
|
IDirectDrawSurface4 *pDDSurface4,
|
||
|
IUnknown *pUnkOuter, CDirectDrawEx *pDirectDrawEx);
|
||
|
~CDDSurface();
|
||
|
HRESULT Init();
|
||
|
HRESULT MakeDIBSection();
|
||
|
HRESULT MakeDibInfo( LPDDSURFACEDESC pddsd, LPBITMAPINFO pbmi );
|
||
|
HRESULT SupportOwnDC();
|
||
|
static HRESULT CreateSimpleSurface(
|
||
|
LPDDSURFACEDESC pSurfaceDesc,
|
||
|
IDirectDrawSurface *pSurface,
|
||
|
IDirectDrawSurface2 *pSurface2,
|
||
|
IDirectDrawSurface3 *pSurface3,
|
||
|
IDirectDrawSurface4 *pSurface4,
|
||
|
IUnknown *pUnkOuter,
|
||
|
CDirectDrawEx *pDirectDrawEx,
|
||
|
IDirectDrawSurface **ppNewDDSurf,
|
||
|
DWORD dwFlags);
|
||
|
HRESULT InternalGetDC(HDC *);
|
||
|
HRESULT InternalReleaseDC(HDC);
|
||
|
HRESULT InternalLock(LPRECT lpDestRect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD dwFlags, HANDLE hEvent);
|
||
|
HRESULT InternalUnlock(LPVOID lpSurfaceData);
|
||
|
HRESULT InternalSetSurfaceDesc(LPDDSURFACEDESC pddsd, DWORD dwFlags);
|
||
|
HRESULT InternalGetAttachedSurface(LPDDSCAPS lpDDSCaps, LPDIRECTDRAWSURFACE FAR * lpDDS, DWORD dwSurfaceType);
|
||
|
HRESULT InternalGetAttachedSurface4(LPDDSCAPS2 lpDDSCaps, LPDIRECTDRAWSURFACE FAR * lpDDS);
|
||
|
HRESULT InternalAddAttachedSurface(LPDIRECTDRAWSURFACE lpDDS, DWORD dwSurfaceType);
|
||
|
HRESULT InternalDeleteAttachedSurface(DWORD dwFlags, LPDIRECTDRAWSURFACE lpDDS, DWORD dwSurfaceType);
|
||
|
HRESULT InternalFlip(LPDIRECTDRAWSURFACE lpDDS, DWORD dw, DWORD dwSurfaceType);
|
||
|
HRESULT InternalBlt(LPRECT lpRect1,LPDIRECTDRAWSURFACE lpDDS, LPRECT lpRect2,DWORD dw, LPDDBLTFX lpfx, DWORD dwSurfaceType);
|
||
|
HRESULT InternalGetPalette(LPDIRECTDRAWPALETTE FAR * ppPal, DWORD dwSurfaceType);
|
||
|
HRESULT InternalSetPalette(LPDIRECTDRAWPALETTE pPal, DWORD dwSurfaceType);
|
||
|
HRESULT InternalGetDDInterface(LPVOID FAR * ppInt);
|
||
|
HRESULT InternalGetSurfaceDesc(LPDDSURFACEDESC pDesc, DWORD dwSurfaceType);
|
||
|
HRESULT InternalGetSurfaceDesc4(LPDDSURFACEDESC2 pDesc);
|
||
|
HRESULT CheckDDPalette();
|
||
|
void DeleteAttachment(IDirectDrawSurface * pOrigSurf, CDDSurface * pFirst);
|
||
|
void CleanUpSurface();
|
||
|
void ReleaseRealInterfaces();
|
||
|
void AddSurfaceToDestroyList(CDDSurface *pSurface);
|
||
|
void DeleteAttachNode(CDDSurface * Surface);
|
||
|
|
||
|
|
||
|
|
||
|
// Non-Delegating versions of IUnknown
|
||
|
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv);
|
||
|
STDMETHODIMP_(ULONG) NonDelegatingAddRef(void);
|
||
|
STDMETHODIMP_(ULONG) NonDelegatingRelease(void);
|
||
|
|
||
|
// IUnknown
|
||
|
STDMETHODIMP QueryInterface(REFIID riid, void **ppv);
|
||
|
STDMETHODIMP_(ULONG) AddRef(void);
|
||
|
STDMETHODIMP_(ULONG) Release(void);
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
class CDDPalette : public INonDelegatingUnknown
|
||
|
{
|
||
|
friend CDirectDrawEx;
|
||
|
friend CDDSurface;
|
||
|
|
||
|
public:
|
||
|
CDDPalette *m_pPrev; // Used by DirectDrawEx to insert in list
|
||
|
CDDPalette *m_pNext;
|
||
|
CDDSurface *m_pFirstSurface;
|
||
|
IUnknown *m_pUnkOuter;
|
||
|
INTSTRUC_IDirectDrawPalette m_DDPInt;
|
||
|
LONG m_cRef;
|
||
|
CDirectDrawEx *m_pDirectDrawEx;
|
||
|
BOOL m_bIsPrimary;
|
||
|
|
||
|
CDDPalette( IDirectDrawPalette * pDDPalette,IUnknown *pUnkOuter,CDirectDrawEx *pDirectDrawEx);
|
||
|
~CDDPalette();
|
||
|
static HRESULT CreateSimplePalette(LPPALETTEENTRY pEntries,
|
||
|
IDirectDrawPalette *pDDPalette,
|
||
|
LPDIRECTDRAWPALETTE FAR * ppPal,
|
||
|
IUnknown FAR * pUnkOuter,
|
||
|
CDirectDrawEx *pDirectDrawEx);
|
||
|
HRESULT SetColorTable (CDDSurface * pSurface, LPPALETTEENTRY pEntries, DWORD dwNumEntries, DWORD dwBase);
|
||
|
void AddSurfaceToList(CDDSurface *pSurface);
|
||
|
void RemoveSurfaceFromList(CDDSurface *pSurface);
|
||
|
STDMETHODIMP InternalSetEntries(DWORD dwFlags, DWORD dwBase, DWORD dwNumEntries, LPPALETTEENTRY lpe);
|
||
|
// Non-Delegating versions of IUnknown
|
||
|
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv);
|
||
|
STDMETHODIMP_(ULONG) NonDelegatingAddRef(void);
|
||
|
STDMETHODIMP_(ULONG) NonDelegatingRelease(void);
|
||
|
|
||
|
// IUnknown
|
||
|
STDMETHODIMP QueryInterface(REFIID riid, void **ppv);
|
||
|
STDMETHODIMP_(ULONG) AddRef(void);
|
||
|
STDMETHODIMP_(ULONG) Release(void);
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* File name of the Direct3D DLL.
|
||
|
*/
|
||
|
#define D3D_DLLNAME "D3DIM.DLL"
|
||
|
|
||
|
/*
|
||
|
* Entry points exported by the Direct3D DLL.
|
||
|
*/
|
||
|
#define D3DCREATE_PROCNAME "Direct3DCreate"
|
||
|
#define D3DCREATEDEVICE_PROCNAME "Direct3DCreateDevice"
|
||
|
#define D3DCREATETEXTURE_PROCNAME "Direct3DCreateTexture"
|
||
|
|
||
|
|
||
|
#ifdef USE_D3D_CSECT
|
||
|
typedef HRESULT (WINAPI * D3DCreateProc)(LPUNKNOWN* lplpD3D,
|
||
|
IUnknown* pUnkOuter);
|
||
|
#else /* USE_D3D_CSECT */
|
||
|
typedef HRESULT (WINAPI * D3DCreateProc)(LPCRITICAL_SECTION lpDDCSect,
|
||
|
LPUNKNOWN* lplpD3D,
|
||
|
IUnknown* pUnkOuter);
|
||
|
#endif /* USE_D3D_CSECT */
|
||
|
|
||
|
typedef HRESULT (WINAPI * D3DCreateTextProc)(REFIID riid,
|
||
|
LPDIRECTDRAWSURFACE lpDDS,
|
||
|
LPUNKNOWN* lplpD3DText,
|
||
|
IUnknown* pUnkOuter);
|
||
|
typedef HRESULT (WINAPI * D3DCreateDeviceProc)(REFIID riid,
|
||
|
LPUNKNOWN lpDirect3D,
|
||
|
LPDIRECTDRAWSURFACE lpDDS,
|
||
|
LPUNKNOWN* lplpD3DDevice,
|
||
|
IUnknown* pUnkOuter);
|
||
|
|
||
|
/*
|
||
|
* some helper functions...
|
||
|
*/
|
||
|
|
||
|
void __stdcall InitDirectDrawInterfaces(IDirectDraw *pDD, INTSTRUC_IDirectDraw *pDDInt,
|
||
|
IDirectDraw2 *pDD2, INTSTRUC_IDirectDraw2 *pDD2Int,
|
||
|
IDirectDraw4 *pDD4, INTSTRUC_IDirectDraw4 *pDD4Int);
|
||
|
void __stdcall InitSurfaceInterfaces(IDirectDrawSurface *pDDSurface,
|
||
|
INTSTRUC_IDirectDrawSurface *pDDSInt,
|
||
|
IDirectDrawSurface2 *pDDSurface2,
|
||
|
INTSTRUC_IDirectDrawSurface2 *pDDS2Int,
|
||
|
IDirectDrawSurface3 *pDDSurface3,
|
||
|
INTSTRUC_IDirectDrawSurface3 *pDDS3Int,
|
||
|
IDirectDrawSurface4 *pDDSurface4,
|
||
|
INTSTRUC_IDirectDrawSurface4 *pDDS4Int );
|
||
|
|
||
|
void __stdcall InitDirectDrawPaletteInterfaces(IDirectDrawPalette *pDDPalette,
|
||
|
INTSTRUC_IDirectDrawPalette *pDDInt);
|
||
|
|
||
|
|
||
|
|