1 /*
2  *  Copyright (C) 2005-2019 Team Kodi
3  *  This file is part of Kodi - https://kodi.tv
4  *
5  *  SPDX-License-Identifier: GPL-2.0-or-later
6  *  See LICENSES/README.md for more information.
7  */
8 
9 #pragma once
10 
11 #include "../AddonBase.h"
12 
13 #ifdef __cplusplus
14 
15 namespace kodi
16 {
17 namespace gui
18 {
19 struct ATTRIBUTE_HIDDEN IRenderHelper
20 {
21   virtual ~IRenderHelper() = default;
22   virtual bool Init() = 0;
23   virtual void Begin() = 0;
24   virtual void End() = 0;
25 }; /* class IRenderHelper */
26 } /* namespace gui */
27 } /* namespace kodi */
28 
29 #if defined(WIN32) && defined(HAS_ANGLE)
30 #include "gl/GLonDX.h"
31 #else
32 /*
33  * Default background GUI render helper class
34  */
35 namespace kodi
36 {
37 namespace gui
38 {
39 struct ATTRIBUTE_HIDDEN CRenderHelperStub : public IRenderHelper
40 {
InitCRenderHelperStub41   bool Init() override { return true; }
BeginCRenderHelperStub42   void Begin() override {}
EndCRenderHelperStub43   void End() override {}
44 }; /* class CRenderHelperStub */
45 
46 using CRenderHelper = CRenderHelperStub;
47 } /* namespace gui */
48 } /* namespace kodi */
49 #endif
50 
51 namespace kodi
52 {
53 namespace gui
54 {
55 
56 /*
57  * Create render background handler, e.g. becomes on "Windows" Angle used
58  * to emulate GL.
59  *
60  * This only be used internal and not from addon's direct.
61  *
62  * Function defines here and not in CAddonBase because of a hen and egg problem.
63  */
GetRenderHelper()64 inline std::shared_ptr<IRenderHelper> ATTRIBUTE_HIDDEN GetRenderHelper()
65 {
66   using namespace ::kodi::addon;
67   if (static_cast<CAddonBase*>(CAddonBase::m_interface->addonBase)->m_renderHelper)
68     return static_cast<CAddonBase*>(CAddonBase::m_interface->addonBase)->m_renderHelper;
69 
70   std::shared_ptr<kodi::gui::IRenderHelper> renderHelper(new CRenderHelper());
71   if (!renderHelper->Init())
72     return nullptr;
73 
74   static_cast<CAddonBase*>(CAddonBase::m_interface->addonBase)->m_renderHelper =
75       renderHelper; // Hold on base for other types
76   return renderHelper;
77 }
78 
79 } /* namespace gui */
80 } /* namespace kodi */
81 
82 #endif /* __cplusplus */
83