diff --git a/src/Text/TextRenderer.cpp b/src/Text/TextRenderer.cpp index aacbba97d..b81a0c6c8 100644 --- a/src/Text/TextRenderer.cpp +++ b/src/Text/TextRenderer.cpp @@ -30,7 +30,7 @@ namespace Magnum { namespace Text { namespace { -std::tuple, std::vector, std::vector> renderInternal(Font& font, GLfloat size, const std::string& text) { +std::tuple, std::vector, std::vector, Rectangle> renderInternal(Font& font, GLfloat size, const std::string& text) { /* Prepare HarfBuzz buffer */ hb_buffer_t *buffer = hb_buffer_create(); hb_buffer_set_unicode_funcs(buffer, hb_icu_get_unicode_funcs()); @@ -106,10 +106,14 @@ std::tuple, std::vector, std::vector typename DimensionTraits::PointType point(const Vector2& vec); @@ -124,10 +128,11 @@ template<> inline Point3D point<3>(const Vector2& vec) { } -template std::tuple::PointType>, std::vector, std::vector> TextRenderer::render(Font& font, GLfloat size, const std::string& text) { +template std::tuple::PointType>, std::vector, std::vector, Rectangle> TextRenderer::render(Font& font, GLfloat size, const std::string& text) { std::vector positions, textureCoordinates; std::vector indices; - std::tie(positions, textureCoordinates, indices) = renderInternal(font, size, text); + Rectangle rectangle; + std::tie(positions, textureCoordinates, indices, rectangle) = renderInternal(font, size, text); /* Create PointXD from Vector2 */ std::vector::PointType> positionsXD; @@ -135,16 +140,17 @@ template std::tuple(position)); - return std::make_tuple(std::move(positionsXD), std::move(textureCoordinates), std::move(indices)); + return std::make_tuple(std::move(positionsXD), std::move(textureCoordinates), std::move(indices), rectangle); } -template Mesh TextRenderer::render(Font& font, GLfloat size, const std::string& text, Buffer* vertexBuffer, Buffer* indexBuffer, Buffer::Usage usage) { +template std::tuple TextRenderer::render(Font& font, GLfloat size, const std::string& text, Buffer* vertexBuffer, Buffer* indexBuffer, Buffer::Usage usage) { Mesh mesh; std::vector::PointType> positions; std::vector textureCoordinates; std::vector indices; - std::tie(positions, textureCoordinates, indices) = render(font, size, text); + Rectangle rectangle; + std::tie(positions, textureCoordinates, indices, rectangle) = render(font, size, text); MeshTools::interleave(&mesh, vertexBuffer, usage, positions, textureCoordinates); MeshTools::compressIndices(&mesh, indexBuffer, usage, indices); @@ -153,7 +159,7 @@ template Mesh TextRenderer::render(Font& fo typename Shaders::AbstractTextShader::Position(), typename Shaders::AbstractTextShader::TextureCoordinates()); - return mesh; + return std::make_tuple(std::move(mesh), rectangle); } template class TextRenderer<2>; diff --git a/src/Text/TextRenderer.h b/src/Text/TextRenderer.h index 26322df2c..629dce858 100644 --- a/src/Text/TextRenderer.h +++ b/src/Text/TextRenderer.h @@ -47,9 +47,11 @@ template class MAGNUM_TEXT_EXPORT TextRenderer { * @param font %Font to use * @param size %Font size * @param text %Text to render - * @return Tuple with vertex positions, texture coordinates and indices + * + * Returns tuple with vertex positions, texture coordinates, indices + * and rectangle spanning the rendered text. */ - static std::tuple::PointType>, std::vector, std::vector> render(Font& font, GLfloat size, const std::string& text); + static std::tuple::PointType>, std::vector, std::vector, Rectangle> render(Font& font, GLfloat size, const std::string& text); /** * @brief Render text @@ -59,10 +61,11 @@ template class MAGNUM_TEXT_EXPORT TextRenderer { * @param vertexBuffer %Buffer where to store vertices * @param indexBuffer %Buffer where to store indices * @param usage Usage of vertex and index buffer - * @return Indexed mesh prepared for use with Shaders::AbstractTextShader - * subclasses + * + * Returns mesh prepared for use with Shaders::AbstractTextShader + * subclasses and rectangle spanning the rendered text. */ - static Mesh render(Font& font, GLfloat size, const std::string& text, Buffer* vertexBuffer, Buffer* indexBuffer, Buffer::Usage usage); + static std::tuple render(Font& font, GLfloat size, const std::string& text, Buffer* vertexBuffer, Buffer* indexBuffer, Buffer::Usage usage); private: #ifndef DOXYGEN_GENERATING_OUTPUT