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