]> git.sesse.net Git - casparcg/blob - modules/flash/producer/FlashAxContainer.h
e5663e0a8fff921170d3fd598cd65f33a16c744f
[casparcg] / modules / flash / producer / FlashAxContainer.h
1 /*\r
2 * Copyright (c) 2011 Sveriges Television AB <info@casparcg.com>\r
3 *\r
4 * This file is part of CasparCG (www.casparcg.com).\r
5 *\r
6 * CasparCG is free software: you can redistribute it and/or modify\r
7 * it under the terms of the GNU General Public License as published by\r
8 * the Free Software Foundation, either version 3 of the License, or\r
9 * (at your option) any later version.\r
10 *\r
11 * CasparCG is distributed in the hope that it will be useful,\r
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14 * GNU General Public License for more details.\r
15 *\r
16 * You should have received a copy of the GNU General Public License\r
17 * along with CasparCG. If not, see <http://www.gnu.org/licenses/>.\r
18 *\r
19 * Author: Nicklas P Andersson\r
20 */\r
21  \r
22 #ifndef _FLASHAXCONTAINER_H__\r
23 #define _FLASHAXCONTAINER_H__\r
24 \r
25 #pragma once\r
26 \r
27 #include <atlbase.h>\r
28 #include <atlcom.h>\r
29 #include <atlhost.h>\r
30 #include <ocmm.h>\r
31 \r
32 #include <functional>\r
33 #include <vector>\r
34 \r
35 #include <core/video_format.h>\r
36 #include "../interop/axflash.h"\r
37 //#import "progid:ShockwaveFlash.ShockwaveFlash.9" no_namespace, named_guids\r
38 \r
39 #include <comdef.h>\r
40 \r
41 #include "../interop/TimerHelper.h"\r
42 \r
43 #include <InitGuid.h>\r
44 #include <ddraw.h>\r
45 \r
46 #ifndef DEFINE_GUID2\r
47 #define DEFINE_GUID2(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \\r
48                 const GUID name \\r
49                                 = { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } }\r
50 #endif     \r
51 \r
52 _COM_SMARTPTR_TYPEDEF(IDirectDraw4, IID_IDirectDraw4);\r
53 \r
54 namespace caspar {\r
55 \r
56 namespace flash {\r
57 \r
58 class TimerHelper;\r
59 struct DirtyRect {\r
60         DirtyRect(LONG l, LONG t, LONG r, LONG b, bool e) : bErase(e), bWhole(false) { \r
61                 rect.left = l;\r
62                 rect.top = t;\r
63                 rect.right = r;\r
64                 rect.bottom = b; \r
65         }\r
66         DirtyRect(const RECT& rc, bool e) : bErase(e), bWhole(false)  {\r
67                 rect.left = rc.left;\r
68                 rect.top = rc.top;\r
69                 rect.right = rc.right;\r
70                 rect.bottom = rc.bottom; \r
71         }\r
72         explicit DirtyRect(bool b) : bWhole(b) {}\r
73 \r
74         RECT    rect;\r
75         bool    bErase;\r
76         bool    bWhole;\r
77 };\r
78 \r
79 extern _ATL_FUNC_INFO fnInfoFlashCallEvent;\r
80 extern _ATL_FUNC_INFO fnInfoReadyStateChangeEvent;\r
81 \r
82 class ATL_NO_VTABLE FlashAxContainer : \r
83                 public ATL::CComCoClass<FlashAxContainer , &CLSID_NULL>,\r
84                 public ATL::CComObjectRootEx<ATL::CComMultiThreadModel>,\r
85                 public IOleClientSite,\r
86                 public IOleContainer,\r
87                 public IOleControlSite,\r
88                 public IOleInPlaceSiteWindowless,\r
89                 public IObjectWithSiteImpl<FlashAxContainer>,\r
90                 public IServiceProvider,\r
91                 public IAdviseSink,\r
92                 public ITimerService,\r
93                 public ITimer,\r
94                 public IDispatchImpl<IDispatch>,\r
95                 public IDispEventSimpleImpl<0, FlashAxContainer, &DIID__IShockwaveFlashEvents>\r
96 {\r
97 \r
98 public:\r
99 \r
100         FlashAxContainer();\r
101         virtual ~FlashAxContainer();\r
102 \r
103         DECLARE_NO_REGISTRY()\r
104         DECLARE_POLY_AGGREGATABLE(FlashAxContainer)\r
105         DECLARE_GET_CONTROLLING_UNKNOWN()\r
106 \r
107         BEGIN_COM_MAP(FlashAxContainer)\r
108                 COM_INTERFACE_ENTRY(IDispatch)\r
109                 COM_INTERFACE_ENTRY(IOleClientSite)\r
110                 COM_INTERFACE_ENTRY(IObjectWithSite)\r
111                 COM_INTERFACE_ENTRY(IOleControlSite)\r
112                 COM_INTERFACE_ENTRY(IOleContainer)\r
113 \r
114                 COM_INTERFACE_ENTRY(IOleInPlaceSiteWindowless)\r
115                 COM_INTERFACE_ENTRY(IOleInPlaceSiteEx)\r
116                 COM_INTERFACE_ENTRY(IOleInPlaceSite)\r
117                 COM_INTERFACE_ENTRY(IOleWindow)\r
118 \r
119                 COM_INTERFACE_ENTRY(IServiceProvider)\r
120 \r
121                 COM_INTERFACE_ENTRY(IAdviseSink)\r
122 \r
123                 COM_INTERFACE_ENTRY(ITimerService)\r
124 \r
125                 COM_INTERFACE_ENTRY(ITimer)\r
126         END_COM_MAP()\r
127 \r
128         BEGIN_SINK_MAP(FlashAxContainer)\r
129                 SINK_ENTRY_INFO(0, DIID__IShockwaveFlashEvents, 0xc5, OnFlashCall, &fnInfoFlashCallEvent)\r
130                 SINK_ENTRY_INFO(0, DIID__IShockwaveFlashEvents, 0xfffffd9f, OnReadyStateChange, &fnInfoReadyStateChangeEvent)\r
131         END_SINK_MAP()\r
132 \r
133         void STDMETHODCALLTYPE OnFlashCall(BSTR request);\r
134         void STDMETHODCALLTYPE OnReadyStateChange(long newState);\r
135 \r
136 // IObjectWithSite\r
137         STDMETHOD(SetSite)(IUnknown* pUnkSite);\r
138 \r
139 // IOleClientSite\r
140         STDMETHOD(SaveObject)();\r
141         STDMETHOD(GetMoniker)(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker** ppmk);\r
142         STDMETHOD(GetContainer)(IOleContainer** ppContainer);\r
143         STDMETHOD(ShowObject)();\r
144         STDMETHOD(OnShowWindow)(BOOL fShow);\r
145         STDMETHOD(RequestNewObjectLayout)();\r
146 \r
147 // IOleInPlaceSite\r
148         STDMETHOD(GetWindow)(HWND* pHwnd);\r
149         STDMETHOD(ContextSensitiveHelp)(BOOL fEnterMode);\r
150         STDMETHOD(CanInPlaceActivate)();\r
151         STDMETHOD(OnInPlaceActivate)();\r
152         STDMETHOD(OnInPlaceDeactivate)();\r
153         STDMETHOD(OnUIActivate)();\r
154         STDMETHOD(OnUIDeactivate)(BOOL fUndoable);\r
155         STDMETHOD(GetWindowContext)(IOleInPlaceFrame** ppFrame, IOleInPlaceUIWindow** ppDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO pFrameInfo);\r
156         STDMETHOD(Scroll)(SIZE scrollExtant);\r
157         STDMETHOD(DiscardUndoState)();\r
158         STDMETHOD(DeactivateAndUndo)();\r
159         STDMETHOD(OnPosRectChange)(LPCRECT lprcPosRect);\r
160 \r
161 // IOleInPlaceSiteEx\r
162         STDMETHOD(OnInPlaceActivateEx)(BOOL* pfNoRedraw, DWORD dwFlags);\r
163         STDMETHOD(OnInPlaceDeactivateEx)(BOOL fNoRedraw);\r
164         STDMETHOD(RequestUIActivate)();\r
165 \r
166 // IOleInPlaceSiteWindowless\r
167         STDMETHOD(CanWindowlessActivate)();\r
168         STDMETHOD(GetCapture)();\r
169         STDMETHOD(SetCapture)(BOOL fCapture);\r
170         STDMETHOD(GetFocus)();\r
171         STDMETHOD(SetFocus)(BOOL fGotFocus);\r
172         STDMETHOD(GetDC)(LPCRECT pRect, DWORD grfFlags, HDC* phDC);\r
173         STDMETHOD(ReleaseDC)(HDC hDC);\r
174         STDMETHOD(InvalidateRect)(LPCRECT pRect, BOOL fErase);\r
175         STDMETHOD(InvalidateRgn)(HRGN hRGN, BOOL fErase);\r
176         STDMETHOD(ScrollRect)(INT dx, INT dy, LPCRECT pRectScroll, LPCRECT pRectClip);\r
177         STDMETHOD(AdjustRect)(LPRECT prc);\r
178         STDMETHOD(OnDefWindowMessage)(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT* plResult);\r
179 \r
180 // IOleControlSite\r
181         STDMETHOD(OnControlInfoChanged)();\r
182         STDMETHOD(LockInPlaceActive)(BOOL fLock);\r
183         STDMETHOD(GetExtendedControl)(IDispatch** ppDisp);\r
184         STDMETHOD(TransformCoords)(POINTL* pPtlHimetric, POINTF* pPtfContainer, DWORD dwFlags);\r
185         STDMETHOD(TranslateAccelerator)(LPMSG lpMsg, DWORD grfModifiers);\r
186         STDMETHOD(OnFocus)(BOOL fGotFocus);\r
187         STDMETHOD(ShowPropertyFrame)();\r
188 \r
189 // IAdviseSink\r
190         STDMETHOD_(void, OnDataChange)(FORMATETC* pFormatetc, STGMEDIUM* pStgmed);\r
191         STDMETHOD_(void, OnViewChange)(DWORD dwAspect, LONG lindex);\r
192         STDMETHOD_(void, OnRename)(IMoniker* pmk);\r
193         STDMETHOD_(void, OnSave)();\r
194         STDMETHOD_(void, OnClose)();\r
195 \r
196 // IServiceProvider\r
197         STDMETHOD(QueryService)( REFGUID rsid, REFIID riid, void** ppvObj);\r
198 \r
199 // IOleContainer\r
200         STDMETHOD(ParseDisplayName)(IBindCtx*, LPOLESTR, ULONG*, IMoniker**)\r
201         {\r
202                 ATLTRACENOTIMPL(_T("IOleContainer::ParseDisplayName"));\r
203         }\r
204         STDMETHOD(EnumObjects)(DWORD, IEnumUnknown** ppenum)\r
205         {\r
206                 if (ppenum == NULL)\r
207                         return E_POINTER;\r
208                 *ppenum = NULL;\r
209                 typedef CComObject<CComEnum<IEnumUnknown, &__uuidof(IEnumUnknown), IUnknown*, _CopyInterface<IUnknown> > > enumunk;\r
210                 enumunk* p = NULL;\r
211                 ATLTRY(p = new enumunk);\r
212                 if(p == NULL)\r
213                         return E_OUTOFMEMORY;\r
214                 IUnknown* pTemp = m_spUnknown;\r
215                 // There is always only one object.\r
216                 HRESULT hRes = p->Init(reinterpret_cast<IUnknown**>(&pTemp), reinterpret_cast<IUnknown**>(&pTemp + 1), GetControllingUnknown(), AtlFlagCopy);\r
217                 if (SUCCEEDED(hRes))\r
218                         hRes = p->QueryInterface(__uuidof(IEnumUnknown), (void**)ppenum);\r
219                 if (FAILED(hRes))\r
220                         delete p;\r
221                 return hRes;\r
222         }\r
223         STDMETHOD(LockContainer)(BOOL)\r
224         {\r
225                 ATLTRACENOTIMPL(_T("IOleContainer::LockContainer"));\r
226         }\r
227 \r
228 //ITimerService\r
229         STDMETHOD(CreateTimer)(ITimer *pReferenceTimer, ITimer **ppNewTimer);\r
230         STDMETHOD(GetNamedTimer)(REFGUID rguidName, ITimer **ppTimer);\r
231         STDMETHOD(SetNamedTimerReference)(REFGUID rguidName, ITimer *pReferenceTimer);\r
232 \r
233 //ITimer\r
234         STDMETHOD(Advise)(VARIANT vtimeMin, VARIANT vtimeMax, VARIANT vtimeInterval, DWORD dwFlags, ITimerSink *pTimerSink, DWORD *pdwCookie);\r
235         STDMETHOD(Unadvise)(DWORD dwCookie);\r
236         STDMETHOD(Freeze)(BOOL fFreeze);\r
237         STDMETHOD(GetTime)(VARIANT *pvtime);\r
238         double GetFPS();\r
239 \r
240         void set_print(const std::function<std::wstring()>& print) { print_ = print;}\r
241 \r
242         HRESULT CreateAxControl();\r
243         void DestroyAxControl();\r
244         HRESULT QueryControl(REFIID iid, void** ppUnk);\r
245 \r
246         template <class Q>\r
247         HRESULT QueryControl(Q** ppUnk)\r
248         {\r
249                 return QueryControl(__uuidof(Q), (void**)ppUnk);\r
250         }\r
251 \r
252 //      static ATL::CComObject<FlashAxContainer>* CreateInstance();\r
253 \r
254         void Tick();\r
255         bool FlashCall(const std::wstring& str, std::wstring& result);\r
256         bool DrawControl(HDC targetDC);\r
257         bool InvalidRect() const { return bInvalidRect_; } \r
258         bool IsEmpty() const { return bIsEmpty_; }\r
259 \r
260         void SetSize(size_t width, size_t height);\r
261         bool IsReadyToRender() const;\r
262         void EnterFullscreen();\r
263 \r
264         static bool CheckForFlashSupport();\r
265 \r
266         ATL::CComPtr<IOleInPlaceObjectWindowless> m_spInPlaceObjectWindowless;\r
267 \r
268 private:\r
269         std::function<std::wstring()> print_;\r
270         TimerHelper* pTimerHelper;\r
271         volatile bool bInvalidRect_;\r
272         volatile bool bCallSuccessful_;\r
273         volatile bool bReadyToRender_;\r
274         volatile bool bIsEmpty_;\r
275         volatile bool bHasNewTiming_;\r
276         std::vector<DirtyRect> bDirtyRects_;\r
277 \r
278 \r
279         IDirectDraw4Ptr *m_lpDD4;\r
280         static CComBSTR flashGUID_;\r
281 \r
282         DWORD timerCount_;\r
283 \r
284 //      state\r
285         bool            bUIActive_;\r
286         bool            bInPlaceActive_;\r
287         unsigned long           bHaveFocus_ : 1;\r
288         unsigned long           bCapture_ : 1;\r
289 \r
290         DWORD m_dwOleObject;\r
291         DWORD m_dwMiscStatus;\r
292         SIZEL m_hmSize;\r
293         SIZEL m_pxSize;\r
294         RECT m_rcPos;\r
295 \r
296         ATL::CComPtr<IUnknown> m_spUnknown;\r
297         ATL::CComPtr<IOleObject> m_spServices;\r
298         ATL::CComPtr<IOleObject> m_spOleObject;\r
299         ATL::CComPtr<IViewObjectEx> m_spViewObject;\r
300 \r
301 //      ATL::CComPtr<ATL::CComObject<MyMoniker> > m_spMyMoniker;\r
302 };\r
303 \r
304 }       //namespace flash\r
305 }       //namespace caspar\r
306 \r
307 #endif  //_FLASHAXCONTAINER_H__