mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
136 lines
4.8 KiB
136 lines
4.8 KiB
/*************************************************************************/
|
|
/* Helper function */
|
|
/*************************************************************************/
|
|
#include "resource.h" // main symbols
|
|
#include <atlctl.h>
|
|
#include "MSWebDVD.h"
|
|
#include "msdvd.h"
|
|
|
|
class CDDrawDVD;
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// COverlayCallback
|
|
class ATL_NO_VTABLE COverlayCallback :
|
|
public CComObjectRootEx<CComSingleThreadModel>,
|
|
public CComCoClass<COverlayCallback, &CLSID_OverlayCallback>,
|
|
public IDispatchImpl<IOverlayCallback, &IID_IOverlayCallback, &LIBID_MSWEBDVDLib>,
|
|
public IObjectWithSiteImplSec<COverlayCallback>,
|
|
public IDDrawExclModeVideoCallback
|
|
{
|
|
public:
|
|
COverlayCallback()
|
|
{
|
|
m_dwWidth = 0;
|
|
m_dwHeight = 0;
|
|
m_dwARWidth = 1;
|
|
m_dwARHeight = 1;
|
|
m_pDDrawDVD = NULL;
|
|
}
|
|
|
|
DECLARE_REGISTRY_RESOURCEID(IDR_OVERLAYCALLBACK)
|
|
|
|
DECLARE_PROTECT_FINAL_CONSTRUCT()
|
|
|
|
BEGIN_COM_MAP(COverlayCallback)
|
|
COM_INTERFACE_ENTRY(IOverlayCallback)
|
|
COM_INTERFACE_ENTRY(IDispatch)
|
|
COM_INTERFACE_ENTRY(IObjectWithSite)
|
|
COM_INTERFACE_ENTRY(IDDrawExclModeVideoCallback)
|
|
END_COM_MAP()
|
|
|
|
// IOverlayCallback
|
|
public:
|
|
|
|
STDMETHOD(SetDDrawDVD)(VARIANT pDDrawDVD);
|
|
|
|
//IDDrawExclModeVideoCallback
|
|
HRESULT STDMETHODCALLTYPE OnUpdateOverlay(BOOL bBefore,
|
|
DWORD dwFlags,
|
|
BOOL bOldVisible,
|
|
const RECT *prcSrcOld,
|
|
const RECT *prcDestOld,
|
|
BOOL bNewVisible,
|
|
const RECT *prcSrcNew,
|
|
const RECT *prcDestNew);
|
|
HRESULT STDMETHODCALLTYPE OnUpdateColorKey(COLORKEY const *pKey, DWORD dwColor);
|
|
HRESULT STDMETHODCALLTYPE OnUpdateSize(DWORD dwWidth, DWORD dwHeight,
|
|
DWORD dwARWidth, DWORD dwARHeight);
|
|
private:
|
|
CDDrawDVD *m_pDDrawDVD;
|
|
DWORD m_dwWidth;
|
|
DWORD m_dwHeight;
|
|
DWORD m_dwARWidth;
|
|
DWORD m_dwARHeight;
|
|
};
|
|
|
|
|
|
//
|
|
// DDraw object class to paint color key, flip etc etc.
|
|
//
|
|
class CDDrawDVD {
|
|
|
|
public:
|
|
CDDrawDVD(CMSWebDVD *pDVD);
|
|
~CDDrawDVD();
|
|
|
|
HRESULT SetupDDraw(const AMDDRAWGUID* lpDDGUID, HWND hWnd);
|
|
HRESULT SetColorKey(COLORREF dwColorKey);
|
|
COLORREF GetColorKey();
|
|
|
|
HRESULT CreateDIBBrush(COLORREF rgb, HBRUSH *phBrush);
|
|
|
|
inline CMSWebDVD* GetDVD() {return m_pDVD;};
|
|
inline IDirectDraw* GetDDrawObj(){return ((IDirectDraw*) m_pDDObject);}
|
|
inline IDirectDrawSurface* GetDDrawSurf(){return ((IDirectDrawSurface*) m_pPrimary);}
|
|
inline IDDrawExclModeVideoCallback * GetCallbackInterface() {
|
|
|
|
CComQIPtr<IDDrawExclModeVideoCallback, &IID_IDDrawExclModeVideoCallback> pIDDrawExclModeVideoCallback(m_pOverlayCallback);
|
|
return (IDDrawExclModeVideoCallback*) pIDDrawExclModeVideoCallback ;
|
|
} ;
|
|
|
|
HRESULT DDColorMatchOffscreen(COLORREF rgb, DWORD* dwColor);
|
|
HRESULT HasOverlay();
|
|
HRESULT HasAvailableOverlay();
|
|
HRESULT GetOverlayMaxStretch(DWORD *pdwMaxStretch);
|
|
private:
|
|
|
|
CComPtr<IDirectDraw> m_pDDObject; // ddraw object
|
|
CComPtr<IDirectDrawSurface> m_pPrimary; // primary ddraw surface
|
|
CComPtr<IOverlayCallback> m_pOverlayCallback ; // overlay callback handler interface
|
|
|
|
COLORREF m_VideoKeyColor ;
|
|
CMSWebDVD *m_pDVD;
|
|
};
|
|
|
|
#define DibFree(pdib) GlobalFreePtr(pdib)
|
|
#define DibWidth(lpbi) _abs((int)(LONG)(((LPBITMAPINFOHEADER)(lpbi))->biWidth))
|
|
#define DibHeight(lpbi) _abs((int)(LONG)(((LPBITMAPINFOHEADER)(lpbi))->biHeight))
|
|
#define DibBitCount(lpbi) (UINT)(((LPBITMAPINFOHEADER)(lpbi))->biBitCount)
|
|
#define DibCompression(lpbi) (DWORD)(((LPBITMAPINFOHEADER)(lpbi))->biCompression)
|
|
|
|
#define DibWidthBytesN(lpbi, n) (UINT)WIDTHBYTES((UINT)(lpbi)->biWidth * (UINT)(n))
|
|
#define DibWidthBytes(lpbi) DibWidthBytesN(lpbi, (lpbi)->biBitCount)
|
|
|
|
#define DibSizeImage(lpbi) ((lpbi)->biSizeImage == 0 \
|
|
? ((DWORD)(UINT)DibWidthBytes(lpbi) * (DWORD)DibHeight(lpbi)) \
|
|
: (lpbi)->biSizeImage)
|
|
|
|
#define DibSize(lpbi) ((lpbi)->biSize + (lpbi)->biSizeImage + (int)(lpbi)->biClrUsed * sizeof(RGBQUAD))
|
|
#define DibPaletteSize(lpbi) (DibNumColors(lpbi) * sizeof(RGBQUAD))
|
|
|
|
#define DibFlipY(lpbi, y) ((int)_abs((lpbi)->biHeight)-1-(y))
|
|
|
|
//HACK for NT BI_BITFIELDS DIBs
|
|
#ifdef WIN32
|
|
#define DibPtr(lpbi) ((lpbi)->biCompression == BI_BITFIELDS \
|
|
? (LPVOID)(DibColors(lpbi) + 3) : (LPVOID)(DibColors(lpbi) + (UINT)(lpbi)->biClrUsed))
|
|
#else
|
|
#define DibPtr(lpbi) (LPVOID)(DibColors(lpbi) + (UINT)(lpbi)->biClrUsed)
|
|
#endif
|
|
|
|
#define DibColors(lpbi) ((RGBQUAD FAR *)((LPBYTE)(lpbi) + (int)(lpbi)->biSize))
|
|
|
|
#define DibNumColors(lpbi) ((lpbi)->biClrUsed == 0 && (lpbi)->biBitCount <= 8 \
|
|
? (int)(1 << (int)(lpbi)->biBitCount) \
|
|
: (int)(lpbi)->biClrUsed)
|
|
|