VIDEOCTL.H

//==========================================================================; 
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
// PURPOSE.
//
// Copyright (c) 1992 - 1997 Microsoft Corporation. All Rights Reserved.
//
//--------------------------------------------------------------------------;

#ifndef __VIDEOCTL__
#define __VIDEOCTL__

// These help with property page implementations. The first can be used to
// load any string from a resource file. The buffer to load into is passed
// as an input parameter. The same buffer is the return value if the string
// was found otherwise it returns TEXT(""). The GetDialogSize is passed the
// resource ID of a dialog box and returns the size of it in screen pixels

#define STR_MAX_LENGTH 256
TCHAR * WINAPI StringFromResource(TCHAR *pBuffer, int iResourceID);

#ifdef UNICODE
#define WideStringFromResource StringFromResource
#else
WCHAR * WINAPI WideStringFromResource(WCHAR *pBuffer, int iResourceID);
#endif


BOOL WINAPI GetDialogSize(int iResourceID, // Dialog box resource identifier
DLGPROC pDlgProc, // Pointer to dialog procedure
LPARAM lParam, // Any user data wanted in pDlgProc
SIZE *pResult); // Returns the size of dialog box

// Class that aggregates an IDirectDraw interface

class CAggDirectDraw : public IDirectDraw, public CUnknown
{
protected:

LPDIRECTDRAW m_pDirectDraw;

public:

DECLARE_IUNKNOWN
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid,void **ppv);

// Constructor and destructor

CAggDirectDraw(TCHAR *pName,LPUNKNOWN pUnk) :
CUnknown(pName,pUnk),
m_pDirectDraw(NULL) { };

virtual CAggDirectDraw::~CAggDirectDraw() { };

// Set the object we should be aggregating
void SetDirectDraw(LPDIRECTDRAW pDirectDraw) {
m_pDirectDraw = pDirectDraw;
}

// IDirectDraw methods

STDMETHODIMP Compact();
STDMETHODIMP CreateClipper(DWORD dwFlags,LPDIRECTDRAWCLIPPER *lplpDDClipper,IUnknown *pUnkOuter);
STDMETHODIMP CreatePalette(DWORD dwFlags,LPPALETTEENTRY lpColorTable,LPDIRECTDRAWPALETTE *lplpDDPalette,IUnknown *pUnkOuter);
STDMETHODIMP CreateSurface(LPDDSURFACEDESC lpDDSurfaceDesc,LPDIRECTDRAWSURFACE *lplpDDSurface,IUnknown *pUnkOuter);
STDMETHODIMP DuplicateSurface(LPDIRECTDRAWSURFACE lpDDSurface,LPDIRECTDRAWSURFACE *lplpDupDDSurface);
STDMETHODIMP EnumDisplayModes(DWORD dwSurfaceDescCount,LPDDSURFACEDESC lplpDDSurfaceDescList,LPVOID lpContext,LPDDENUMMODESCALLBACK lpEnumCallback);
STDMETHODIMP EnumSurfaces(DWORD dwFlags,LPDDSURFACEDESC lpDDSD,LPVOID lpContext,LPDDENUMSURFACESCALLBACK lpEnumCallback);
STDMETHODIMP FlipToGDISurface();
STDMETHODIMP GetCaps(LPDDCAPS lpDDDriverCaps,LPDDCAPS lpDDHELCaps);
STDMETHODIMP GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc);
STDMETHODIMP GetFourCCCodes(LPDWORD lpNumCodes,LPDWORD lpCodes);
STDMETHODIMP GetGDISurface(LPDIRECTDRAWSURFACE *lplpGDIDDSurface);
STDMETHODIMP GetMonitorFrequency(LPDWORD lpdwFrequency);
STDMETHODIMP GetScanLine(LPDWORD lpdwScanLine);
STDMETHODIMP GetVerticalBlankStatus(LPBOOL lpblsInVB);
STDMETHODIMP Initialize(GUID *lpGUID);
STDMETHODIMP RestoreDisplayMode();
STDMETHODIMP SetCooperativeLevel(HWND hWnd,DWORD dwFlags);
STDMETHODIMP SetDisplayMode(DWORD dwWidth,DWORD dwHeight,DWORD dwBpp);
STDMETHODIMP WaitForVerticalBlank(DWORD dwFlags,HANDLE hEvent);
};


// Class that aggregates an IDirectDrawSurface interface

class CAggDrawSurface : public IDirectDrawSurface, public CUnknown
{
protected:

LPDIRECTDRAWSURFACE m_pDirectDrawSurface;

public:

DECLARE_IUNKNOWN
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid,void **ppv);

// Constructor and destructor

CAggDrawSurface(TCHAR *pName,LPUNKNOWN pUnk) :
CUnknown(pName,pUnk),
m_pDirectDrawSurface(NULL) { };

virtual ~CAggDrawSurface() { };

// Set the object we should be aggregating
void SetDirectDrawSurface(LPDIRECTDRAWSURFACE pDirectDrawSurface) {
m_pDirectDrawSurface = pDirectDrawSurface;
}

// IDirectDrawSurface methods

STDMETHODIMP AddAttachedSurface(LPDIRECTDRAWSURFACE lpDDSAttachedSurface);
STDMETHODIMP AddOverlayDirtyRect(LPRECT lpRect);
STDMETHODIMP Blt(LPRECT lpDestRect,LPDIRECTDRAWSURFACE lpDDSrcSurface,LPRECT lpSrcRect,DWORD dwFlags,LPDDBLTFX lpDDBltFx);
STDMETHODIMP BltBatch(LPDDBLTBATCH lpDDBltBatch,DWORD dwCount,DWORD dwFlags);
STDMETHODIMP BltFast(DWORD dwX,DWORD dwY,LPDIRECTDRAWSURFACE lpDDSrcSurface,LPRECT lpSrcRect,DWORD dwTrans);
STDMETHODIMP DeleteAttachedSurface(DWORD dwFlags,LPDIRECTDRAWSURFACE lpDDSAttachedSurface);
STDMETHODIMP EnumAttachedSurfaces(LPVOID lpContext,LPDDENUMSURFACESCALLBACK lpEnumSurfacesCallback);
STDMETHODIMP EnumOverlayZOrders(DWORD dwFlags,LPVOID lpContext,LPDDENUMSURFACESCALLBACK lpfnCallback);
STDMETHODIMP Flip(LPDIRECTDRAWSURFACE lpDDSurfaceTargetOverride,DWORD dwFlags);
STDMETHODIMP GetAttachedSurface(LPDDSCAPS lpDDSCaps,LPDIRECTDRAWSURFACE *lplpDDAttachedSurface);
STDMETHODIMP GetBltStatus(DWORD dwFlags);
STDMETHODIMP GetCaps(LPDDSCAPS lpDDSCaps);
STDMETHODIMP GetClipper(LPDIRECTDRAWCLIPPER *lplpDDClipper);
STDMETHODIMP GetColorKey(DWORD dwFlags,LPDDCOLORKEY lpDDColorKey);
STDMETHODIMP GetDC(HDC *lphDC);
STDMETHODIMP GetFlipStatus(DWORD dwFlags);
STDMETHODIMP GetOverlayPosition(LPLONG lpdwX,LPLONG lpdwY);
STDMETHODIMP GetPalette(LPDIRECTDRAWPALETTE *lplpDDPalette);
STDMETHODIMP GetPixelFormat(LPDDPIXELFORMAT lpDDPixelFormat);
STDMETHODIMP GetSurfaceDesc(LPDDSURFACEDESC lpDDSurfaceDesc);
STDMETHODIMP Initialize(LPDIRECTDRAW lpDD,LPDDSURFACEDESC lpDDSurfaceDesc);
STDMETHODIMP IsLost();
STDMETHODIMP Lock(LPRECT lpDestRect,LPDDSURFACEDESC lpDDSurfaceDesc,DWORD dwFlags,HANDLE hEvent);
STDMETHODIMP ReleaseDC(HDC hDC);
STDMETHODIMP Restore();
STDMETHODIMP SetClipper(LPDIRECTDRAWCLIPPER lpDDClipper);
STDMETHODIMP SetColorKey(DWORD dwFlags,LPDDCOLORKEY lpDDColorKey);
STDMETHODIMP SetOverlayPosition(LONG dwX,LONG dwY);
STDMETHODIMP SetPalette(LPDIRECTDRAWPALETTE lpDDPalette);
STDMETHODIMP Unlock(LPVOID lpSurfaceData);
STDMETHODIMP UpdateOverlay(LPRECT lpSrcRect,LPDIRECTDRAWSURFACE lpDDDestSurface,LPRECT lpDestRect,DWORD dwFlags,LPDDOVERLAYFX lpDDOverlayFX);
STDMETHODIMP UpdateOverlayDisplay(DWORD dwFlags);
STDMETHODIMP UpdateOverlayZOrder(DWORD dwFlags,LPDIRECTDRAWSURFACE lpDDSReference);
};


// ActiveMovie must work on multiple platforms, in particular it also runs on
// Windows NT 3.51 which does not have DirectDraw capabilities. The filters
// cannot therefore link statically to the DirectDraw library. To make their
// lives that little bit easier we provide this class that manages loading
// and unloading the library and creating the initial IDirectDraw interface

typedef DWORD (WINAPI *PGETFILEVERSIONINFOSIZE)(LPTSTR,LPDWORD);
typedef BOOL (WINAPI *PGETFILEVERSIONINFO)(LPTSTR,DWORD,DWORD,LPVOID);
typedef BOOL (WINAPI *PVERQUERYVALUE)(LPVOID,LPTSTR,LPVOID,PUINT);

class CLoadDirectDraw
{
LPDIRECTDRAW m_pDirectDraw; // The DirectDraw driver instance
HINSTANCE m_hDirectDraw; // Handle to the loaded library

public:

CLoadDirectDraw();
~CLoadDirectDraw();

HRESULT LoadDirectDraw(LPSTR szDevice);
void ReleaseDirectDraw();
HRESULT IsDirectDrawLoaded();
LPDIRECTDRAW GetDirectDraw();
BOOL IsDirectDrawVersion1();
};

#endif // __VIDEOCTL__