From be933ef2241d79558f91796cc5b3a161f72ebf9c Mon Sep 17 00:00:00 2001 From: manuel Date: Mon, 19 Oct 2020 00:52:24 +0200 Subject: sync with upstream --- .../include/kodi/gui/controls/Rendering.h | 217 +++++++++++++++++++++ 1 file changed, 217 insertions(+) create mode 100644 xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Rendering.h (limited to 'xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Rendering.h') diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Rendering.h b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Rendering.h new file mode 100644 index 0000000..7f5feef --- /dev/null +++ b/xbmc/addons/kodi-dev-kit/include/kodi/gui/controls/Rendering.h @@ -0,0 +1,217 @@ +/* + * Copyright (C) 2005-2018 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +#include "../../c-api/gui/controls/rendering.h" +#include "../Window.h" +#include "../renderHelper.h" + +#ifdef __cplusplus + +namespace kodi +{ +namespace gui +{ +namespace controls +{ + +//============================================================================ +/// @defgroup cpp_kodi_gui_windows_controls_CRendering Control Rendering +/// @ingroup cpp_kodi_gui_windows_controls +/// @brief @cpp_class{ kodi::gui::controls::CRendering } +/// **Window control for rendering own parts**\n +/// This rendering control is used when own parts are needed. +/// +/// You have the control over them to render direct OpenGL or DirectX content +/// to the screen set by the size of them. +/// +/// Alternative can be the virtual functions from t his been ignored if the +/// callbacks are defined by the @ref CRendering_SetIndependentCallbacks +/// function and class is used as single and not as a parent class. +/// +/// It has the header @ref Rendering.h "#include " +/// be included to enjoy it. +/// +/// Here you find the needed skin part for a @ref Addon_Rendering_control "rendering control". +/// +/// @note The call of the control is only possible from the corresponding +/// window as its class and identification number is required. +/// +class ATTRIBUTE_HIDDEN CRendering : public CAddonGUIControlBase +{ +public: + //========================================================================== + /// @ingroup cpp_kodi_gui_windows_controls_CRendering + /// @brief Construct a new control. + /// + /// @param[in] window Related window control class + /// @param[in] controlId Used skin xml control id + /// + CRendering(CWindow* window, int controlId) : CAddonGUIControlBase(window) + { + m_controlHandle = m_interface->kodi_gui->window->get_control_render_addon( + m_interface->kodiBase, m_Window->GetControlHandle(), controlId); + if (m_controlHandle) + m_interface->kodi_gui->control_rendering->set_callbacks(m_interface->kodiBase, + m_controlHandle, this, OnCreateCB, + OnRenderCB, OnStopCB, OnDirtyCB); + else + kodi::Log(ADDON_LOG_FATAL, "kodi::gui::controls::%s can't create control class from Kodi !!!", + __FUNCTION__); + } + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_windows_controls_CRendering + /// @brief Destructor. + /// + ~CRendering() override + { + m_interface->kodi_gui->control_rendering->destroy(m_interface->kodiBase, m_controlHandle); + } + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_windows_controls_CRendering + /// @brief To create rendering control on Add-on. + /// + /// Function creates the needed rendering control for Kodi which becomes + /// handled and processed from Add-on + /// + /// @note This is callback function from Kodi to Add-on and not to use + /// for calls from add-on to this function. + /// + /// @param[in] x Horizontal position + /// @param[in] y Vertical position + /// @param[in] w Width of control + /// @param[in] h Height of control + /// @param[in] device The device to use. For OpenGL is empty on Direct X is + /// the needed device send. + /// @return Add-on needs to return true if successed, otherwise false. + /// + /// @note The @ref kodi::HardwareContext is basically a simple pointer which + /// has to be changed to the desired format at the corresponding places using + /// `static_cast<...>(...)`. + /// + virtual bool Create(int x, int y, int w, int h, kodi::HardwareContext device) { return false; } + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_windows_controls_CRendering + /// @brief Render process call from Kodi. + /// + /// @note This is callback function from Kodi to Add-on and not to use for + /// calls from add-on to this function. + /// + virtual void Render() {} + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_windows_controls_CRendering + /// @brief Call from Kodi to stop rendering process. + /// + /// @note This is callback function from Kodi to Add-on and not to use + /// for calls from add-on to this function. + /// + virtual void Stop() {} + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_windows_controls_CRendering + /// @brief Call from Kodi where add-on becomes asked about dirty rendering + /// region. + /// + /// @note This is callback function from Kodi to Add-on and not to use + /// for calls from add-on to this function. + /// + /// @return True if a render region is dirty and need rendering. + /// + virtual bool Dirty() { return false; } + //-------------------------------------------------------------------------- + + //========================================================================== + /// @ingroup cpp_kodi_gui_windows_controls_CRendering + /// @anchor CRendering_SetIndependentCallbacks + /// @brief If the class is used independent (with "new CRendering") + /// and not as parent (with "cCLASS_own : CRendering") from own must + /// be the callback from Kodi to add-on overdriven with own functions! + /// + /// @param[in] cbhdl Addon related class point where becomes given as value on + /// related functions. + /// @param[in] CBCreate External creation function pointer, see also @ref Create + /// about related values + /// @param[in] CBRender External render function pointer, see also @ref Render + /// about related values + /// @param[in] CBStop External stop function pointer, see also @ref Stop + /// about related values + /// @param[in] CBDirty External dirty function pointer, see also @ref Dirty + /// about related values + /// + void SetIndependentCallbacks(kodi::gui::ClientHandle cbhdl, + bool (*CBCreate)(kodi::gui::ClientHandle cbhdl, + int x, + int y, + int w, + int h, + kodi::HardwareContext device), + void (*CBRender)(kodi::gui::ClientHandle cbhdl), + void (*CBStop)(kodi::gui::ClientHandle cbhdl), + bool (*CBDirty)(kodi::gui::ClientHandle cbhdl)) + { + if (!cbhdl || !CBCreate || !CBRender || !CBStop || !CBDirty) + { + kodi::Log(ADDON_LOG_ERROR, "kodi::gui::controls::%s called with nullptr !!!", __FUNCTION__); + return; + } + + m_interface->kodi_gui->control_rendering->set_callbacks( + m_interface->kodiBase, m_controlHandle, cbhdl, CBCreate, CBRender, CBStop, CBDirty); + } + //-------------------------------------------------------------------------- + +private: + /* + * Defined callback functions from Kodi to add-on, for use in parent / child system + * (is private)! + */ + static bool OnCreateCB( + KODI_GUI_CLIENT_HANDLE cbhdl, int x, int y, int w, int h, ADDON_HARDWARE_CONTEXT device) + { + static_cast(cbhdl)->m_renderHelper = kodi::gui::GetRenderHelper(); + return static_cast(cbhdl)->Create(x, y, w, h, device); + } + + static void OnRenderCB(KODI_GUI_CLIENT_HANDLE cbhdl) + { + if (!static_cast(cbhdl)->m_renderHelper) + return; + static_cast(cbhdl)->m_renderHelper->Begin(); + static_cast(cbhdl)->Render(); + static_cast(cbhdl)->m_renderHelper->End(); + } + + static void OnStopCB(KODI_GUI_CLIENT_HANDLE cbhdl) + { + static_cast(cbhdl)->Stop(); + static_cast(cbhdl)->m_renderHelper = nullptr; + } + + static bool OnDirtyCB(KODI_GUI_CLIENT_HANDLE cbhdl) + { + return static_cast(cbhdl)->Dirty(); + } + + std::shared_ptr m_renderHelper; +}; + +} /* namespace controls */ +} /* namespace gui */ +} /* namespace kodi */ + +#endif /* __cplusplus */ -- cgit v1.2.3