#ifndef Magnum_Text_RendererGL_h #define Magnum_Text_RendererGL_h /* This file is part of Magnum. Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025 Vladimír Vondruš Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** @file * @brief Class @ref Magnum::Text::RendererGL, enum @ref Magnum::Text::RendererGLFlag, enum set @ref Magnum::Text::RendererGLFlags * @m_since_latest */ #include "Magnum/configure.h" #ifdef MAGNUM_TARGET_GL #include "Magnum/GL/GL.h" #include "Magnum/Text/Renderer.h" namespace Magnum { namespace Text { /** @brief OpenGL text renderer flag @m_since_latest A superset of @ref RendererFlag. @note This enum is available only if Magnum is compiled with @ref MAGNUM_TARGET_GL enabled (done by default). See @ref building-features for more information. @see @ref RendererGLFlags, @ref RendererGL */ /* Currently is the same as RendererFlag, but is made to a dedicated type to not cause a breaking change once GL-specific flags are introduced, such as buffer mapping */ enum class RendererGLFlag: UnsignedByte { /** @copydoc RendererFlag::GlyphPositionsClusters */ GlyphPositionsClusters = UnsignedByte(RendererFlag::GlyphPositionsClusters) }; /** @debugoperatorenum{RendererGLFlag} @m_since_latest @note This function is available only if Magnum is compiled with @ref MAGNUM_TARGET_GL enabled (done by default). See @ref building-features for more information. */ MAGNUM_TEXT_EXPORT Debug& operator<<(Debug& output, RendererGLFlag value); /** @brief OpenGL text renderer flags @m_since_latest @note This enum set is available only if Magnum is compiled with @ref MAGNUM_TARGET_GL enabled (done by default). See @ref building-features for more information. @see @ref RendererGL */ typedef Containers::EnumSet RendererGLFlags; CORRADE_ENUMSET_OPERATORS(RendererGLFlags) /** @debugoperatorenum{RendererGLFlags} @m_since_latest @note This function is available only if Magnum is compiled with @ref MAGNUM_TARGET_GL enabled (done by default). See @ref building-features for more information. */ MAGNUM_TEXT_EXPORT Debug& operator<<(Debug& output, RendererGLFlags value); /** @brief OpenGL text renderer @m_since_latest Specialization of a @ref Renderer that uploads index and vertex data to a @ref GL::Mesh. See the @ref Renderer class documentation for information about setting up an instance of this class, filling it with data and drawing the text with it. @note This class is available only if Magnum is compiled with @ref MAGNUM_TARGET_GL enabled (done by default). See @ref building-features for more information. */ class MAGNUM_TEXT_EXPORT RendererGL: public Renderer { public: /** * @brief Construct * @param glyphCache Glyph cache to use * @param flags Opt-in feature flags * * Unlike with the @ref Renderer base, the OpenGL implementation needs * to have a complete control over memory layout and allocation and * thus it isn't possible to supply custom allocators. If you want the * control, use @ref Renderer with custom index and vertex allocators * and fill a @ref GL::Mesh instance with the data manually. */ explicit RendererGL(const AbstractGlyphCache& glyphCache, RendererGLFlags flags = {}); /** * @brief Construct without creating the internal state and the OpenGL objects * * The constructed instance is equivalent to moved-from state, i.e. no * APIs can be safely called on the object. Useful in cases where you * will overwrite the instance later anyway. Move another object over * it to make it useful. * * This function can be safely used for constructing (and later * destructing) objects even without any OpenGL context being active. * However note that this is a low-level and a potentially dangerous * API, see the documentation of @ref NoCreate for alternatives. */ explicit RendererGL(NoCreateT) noexcept: Renderer{NoCreate} {} /** @brief Copying is not allowed */ RendererGL(RendererGL&) = delete; /** * @brief Move constructor * * Performs a destructive move, i.e. the original object isn't usable * afterwards anymore. */ RendererGL(RendererGL&&) noexcept; ~RendererGL(); /** @brief Copying is not allowed */ RendererGL& operator=(RendererGL&) = delete; /** @brief Move assignment */ RendererGL& operator=(RendererGL&&) noexcept; /** @brief Flags */ RendererGLFlags flags() const; /** @brief Mesh containing the rendered index and vertex data */ GL::Mesh& mesh(); const GL::Mesh& mesh() const; /**< @overload */ /** * @brief Set index type * @return Reference to self (for method chaining) * * Calls @ref Renderer::setIndexType() and updates @ref mesh() with the * rendered index data, if different from before. Compared to * @ref Renderer, the default index type is * @ref MeshIndexType::UnsignedShort, not * @ref MeshIndexType::UnsignedByte, as use of 8-bit indices is * discouraged on contemporary GPUs. */ RendererGL& setIndexType(MeshIndexType atLeast); /** * @brief Reserve capacity for given glyph count * @return Reference to self (for method chaining) * * Calls @ref Renderer::reserve() and updates @ref mesh() with the * rendered index data, if different from before. */ RendererGL& reserve(UnsignedInt glyphCapacity, UnsignedInt runCapacity); /** * @brief Clear rendered glyphs, runs and vertices * @return Reference to self (for method chaining) * * Calls @ref Renderer::clear() and additionally also sets @ref mesh() * index count to @cpp 0 @ce. */ RendererGL& clear(); /** * @brief Reset internal renderer state * @return Reference to self (for method chaining) * * Calls @ref Renderer::reset(), and additionally also sets @ref mesh() * index count to @cpp 0 @ce. */ RendererGL& reset(); /** * @brief Wrap up rendering of all text added so far * * Calls @ref Renderer::render(), updates @ref mesh() with the newly * rendered vertex data and potentially updates also the index data, if * different from before. */ Containers::Pair render(); /* Overloads to remove a WTF factor from method chaining order, and to ensure our render() is called instead of Render::render() */ #ifndef DOXYGEN_GENERATING_OUTPUT RendererGL& setCursor(const Vector2& cursor) { return static_cast(Renderer::setCursor(cursor)); } RendererGL& setAlignment(Alignment alignment) { return static_cast(Renderer::setAlignment(alignment)); } RendererGL& setLineAdvance(Float advance) { return static_cast(Renderer::setLineAdvance(advance)); } RendererGL& setLayoutDirection(LayoutDirection direction) { return static_cast(Renderer::setLayoutDirection(direction)); } RendererGL& add(AbstractShaper& shaper, Float size, Containers::StringView text, UnsignedInt begin, UnsignedInt end, Containers::ArrayView features); RendererGL& add(AbstractShaper& shaper, Float size, Containers::StringView text, UnsignedInt begin, UnsignedInt end); RendererGL& add(AbstractShaper& shaper, Float size, Containers::StringView text, UnsignedInt begin, UnsignedInt end, std::initializer_list features); RendererGL& add(AbstractShaper& shaper, Float size, Containers::StringView text, Containers::ArrayView features); RendererGL& add(AbstractShaper& shaper, Float size, Containers::StringView text); RendererGL& add(AbstractShaper& shaper, Float size, Containers::StringView text, std::initializer_list features); Containers::Pair render(AbstractShaper& shaper, Float size, Containers::StringView text, Containers::ArrayView features); Containers::Pair render(AbstractShaper& shaper, Float size, Containers::StringView text); Containers::Pair render(AbstractShaper& shaper, Float size, Containers::StringView text, std::initializer_list features); #endif private: struct State; /* Needs to extract the GL::Buffer instances from inside */ #ifdef MAGNUM_BUILD_DEPRECATED CORRADE_IGNORE_DEPRECATED_PUSH friend AbstractRenderer; CORRADE_IGNORE_DEPRECATED_POP #endif }; }} #else #error this header is available only in the OpenGL build #endif #endif