diff --git a/src/Magnum/Text/Renderer.cpp b/src/Magnum/Text/Renderer.cpp index fe368389b..b815cfb43 100644 --- a/src/Magnum/Text/Renderer.cpp +++ b/src/Magnum/Text/Renderer.cpp @@ -1986,6 +1986,8 @@ AbstractRenderer::AbstractRenderer(AbstractFont& font, const AbstractGlyphCache& _mesh.setPrimitive(MeshPrimitive::Triangles); } +AbstractRenderer::AbstractRenderer(AbstractRenderer&&) noexcept = default; + AbstractRenderer::~AbstractRenderer() = default; template BasicRenderer::BasicRenderer(AbstractFont& font, const AbstractGlyphCache& cache, const Float size, const Alignment alignment): AbstractRenderer(font, cache, size, alignment) { diff --git a/src/Magnum/Text/Renderer.h b/src/Magnum/Text/Renderer.h index 37b7ed12c..7c62ddf5b 100644 --- a/src/Magnum/Text/Renderer.h +++ b/src/Magnum/Text/Renderer.h @@ -1426,6 +1426,20 @@ class MAGNUM_TEXT_EXPORT AbstractRenderer { */ static std::tuple, std::vector, std::vector, Range2D> render(AbstractFont& font, const AbstractGlyphCache& cache, Float size, const std::string& text, Alignment alignment = Alignment::LineLeft); + /** @brief Copying is not allowed */ + AbstractRenderer(AbstractRenderer&) = delete; + + /** @brief Move constructor */ + AbstractRenderer(AbstractRenderer&&) noexcept; + + /** @brief Copying is not allowed */ + AbstractRenderer& operator=(AbstractRenderer&) = delete; + + /** @brief Move assignment is not allowed */ + /* Because it contains reference members. Not going to fix this, just + pinning down existing behavior. */ + AbstractRenderer& operator=(AbstractRenderer&&) = delete; + /** * @brief Capacity for rendered glyphs * diff --git a/src/Magnum/Text/Test/RendererGLTest.cpp b/src/Magnum/Text/Test/RendererGLTest.cpp index 77932e444..8432fcf4c 100644 --- a/src/Magnum/Text/Test/RendererGLTest.cpp +++ b/src/Magnum/Text/Test/RendererGLTest.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include "Magnum/Image.h" @@ -77,6 +78,10 @@ struct RendererGLTest: GL::OpenGLTester { void renderClearReset(); void renderIndexTypeChanged(); + template void constructND(); + template void constructNDCopy(); + template void constructNDMove(); + void renderMesh(); void renderMeshIndexType(); void mutableText(); @@ -220,7 +225,14 @@ RendererGLTest::RendererGLTest() { &RendererGLTest::renderSetup, &RendererGLTest::renderTeardown); - addTests({&RendererGLTest::renderMesh, + addTests({&RendererGLTest::constructND<2>, + &RendererGLTest::constructND<3>, + &RendererGLTest::constructNDCopy<2>, + &RendererGLTest::constructNDCopy<3>, + &RendererGLTest::constructNDMove<2>, + &RendererGLTest::constructNDMove<3>, + + &RendererGLTest::renderMesh, &RendererGLTest::renderMeshIndexType, &RendererGLTest::mutableText, @@ -902,6 +914,68 @@ GlyphCacheGL testGlyphCache(AbstractFont& font) { return cache; } +template void RendererGLTest::constructND() { + setTestCaseTemplateName(Utility::format("{}", dimensions)); + + struct: AbstractGlyphCache { + using AbstractGlyphCache::AbstractGlyphCache; + + GlyphCacheFeatures doFeatures() const override { return {}; } + } glyphCache{PixelFormat::R8Unorm, {16, 16}}; + + TestFont font; + font.openFile({}, 0.5f); + glyphCache.addFont(3, &font); + + BasicRenderer a{font, glyphCache, 3.0f}; + CORRADE_COMPARE(a.capacity(), 0); + CORRADE_COMPARE(a.fontSize(), 3.0f); + CORRADE_COMPARE(a.rectangle(), Range2D{}); + CORRADE_VERIFY(a.indexBuffer().id()); + CORRADE_VERIFY(a.vertexBuffer().id()); + { + #ifndef MAGNUM_TARGET_GLES + CORRADE_EXPECT_FAIL_IF(!GL::Context::current().isExtensionSupported(), + "There's no way to know if the mesh was initialized without" << GL::Extensions::ARB::vertex_array_object::string() << Debug::nospace << "."); + #elif defined(MAGNUM_TARGET_GLES2) + CORRADE_EXPECT_FAIL_IF(!GL::Context::current().isExtensionSupported(), + "There's no way to know if the mesh was initialized without" << GL::Extensions::OES::vertex_array_object::string() << Debug::nospace << "."); + #endif + CORRADE_VERIFY(a.mesh().id()); + } +} + +template void RendererGLTest::constructNDCopy() { + setTestCaseTemplateName(Utility::format("{}", dimensions)); + + CORRADE_VERIFY(!std::is_copy_constructible>{}); + CORRADE_VERIFY(!std::is_copy_assignable>{}); +} + +template void RendererGLTest::constructNDMove() { + setTestCaseTemplateName(Utility::format("{}", dimensions)); + + struct: AbstractGlyphCache { + using AbstractGlyphCache::AbstractGlyphCache; + + GlyphCacheFeatures doFeatures() const override { return {}; } + } glyphCache{PixelFormat::R8Unorm, {16, 16}}; + + TestFont font; + font.openFile({}, 0.5f); + glyphCache.addFont(3, &font); + + BasicRenderer a{font, glyphCache, 3.0f}; + + BasicRenderer b = Utility::move(a); + CORRADE_COMPARE(b.fontSize(), 3.0f); + + CORRADE_VERIFY(std::is_nothrow_move_constructible>::value); + /* Because it contains reference members. Not going to fix this, just + pinning down existing behavior. */ + CORRADE_VERIFY(!std::is_move_assignable>{}); +} + void RendererGLTest::renderMesh() { /* Like render(middle center), but with a mesh output instead of data */