mirror of https://github.com/mosra/magnum.git
8 changed files with 502 additions and 1 deletions
@ -0,0 +1,82 @@
|
||||
/*
|
||||
This file is part of Magnum. |
||||
|
||||
Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 |
||||
Vladimír Vondruš <mosra@centrum.cz> |
||||
|
||||
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. |
||||
*/ |
||||
|
||||
#include "Screenshot.h" |
||||
|
||||
#include <Corrade/Containers/Optional.h> |
||||
#include <Corrade/PluginManager/Manager.h> |
||||
|
||||
#include "Magnum/PixelFormat.h" |
||||
#include "Magnum/Image.h" |
||||
#include "Magnum/GL/AbstractFramebuffer.h" |
||||
#include "Magnum/GL/PixelFormat.h" |
||||
#include "Magnum/Trade/AbstractImageConverter.h" |
||||
|
||||
namespace Magnum { namespace DebugTools { |
||||
|
||||
bool screenshot(GL::AbstractFramebuffer& framebuffer, const std::string& filename) { |
||||
PluginManager::Manager<Trade::AbstractImageConverter> manager; |
||||
return screenshot(manager, framebuffer, filename); |
||||
} |
||||
|
||||
bool screenshot(PluginManager::Manager<Trade::AbstractImageConverter>& manager, GL::AbstractFramebuffer& framebuffer, const std::string& filename) { |
||||
/* Get the implementation-specific color read format for given framebuffer */ |
||||
const GL::PixelFormat format = framebuffer.implementationColorReadFormat(); |
||||
const GL::PixelType type = framebuffer.implementationColorReadType(); |
||||
Containers::Optional<PixelFormat> genericFormat; |
||||
#ifndef DOXYGEN_GENERATING_OUTPUT /* It gets *really* confused */ |
||||
#define _c(generic, glFormat, glType) if(format == GL::PixelFormat::glFormat && type == GL::PixelType::glType) genericFormat = PixelFormat::generic; |
||||
#define _s(generic) |
||||
#include "Magnum/GL/Implementation/pixelFormatMapping.hpp" |
||||
#undef _c |
||||
#undef _s |
||||
#endif |
||||
if(!genericFormat) { |
||||
Error{} << "DebugTools::screenshot(): can't map (" << Debug::nospace << format << Debug::nospace << "," << type << Debug::nospace << ") to a generic pixel format"; |
||||
return false; |
||||
} |
||||
|
||||
return screenshot(manager, framebuffer, *genericFormat, filename); |
||||
} |
||||
|
||||
bool screenshot(GL::AbstractFramebuffer& framebuffer, const PixelFormat format, const std::string& filename) { |
||||
PluginManager::Manager<Trade::AbstractImageConverter> manager; |
||||
return screenshot(manager, framebuffer, format, filename); |
||||
} |
||||
|
||||
bool screenshot(PluginManager::Manager<Trade::AbstractImageConverter>& manager, GL::AbstractFramebuffer& framebuffer, const PixelFormat format, const std::string& filename) { |
||||
Containers::Pointer<Trade::AbstractImageConverter> converter; |
||||
if(!(converter = manager.loadAndInstantiate("AnyImageConverter"))) |
||||
return false; |
||||
|
||||
Image2D image = framebuffer.read(framebuffer.viewport(), {format}); |
||||
if(!converter->exportToFile(image, filename)) |
||||
return false; |
||||
|
||||
Debug{} << "DebugTools::screenshot(): saved a" << format << "image of size" << image.size() << "to" << filename; |
||||
return true; |
||||
} |
||||
|
||||
}} |
||||
@ -0,0 +1,101 @@
|
||||
#ifndef Magnum_DebugTools_Screenshot_h |
||||
#define Magnum_DebugTools_Screenshot_h |
||||
/*
|
||||
This file is part of Magnum. |
||||
|
||||
Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 |
||||
Vladimír Vondruš <mosra@centrum.cz> |
||||
|
||||
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 Function @ref Magnum::DebugTools::screenshot() |
||||
*/ |
||||
|
||||
#include <string> |
||||
#include <Corrade/PluginManager/PluginManager.h> |
||||
|
||||
#include "Magnum/Magnum.h" |
||||
#include "Magnum/DebugTools/visibility.h" |
||||
#include "Magnum/GL/GL.h" |
||||
#include "Magnum/Trade/Trade.h" |
||||
|
||||
namespace Magnum { namespace DebugTools { |
||||
|
||||
/**
|
||||
@brief Save a screenshot to a file |
||||
@param framebuffer Framebuffer which to read |
||||
@param filename File where to save |
||||
|
||||
Reads a rectangle of given @p framebuffer, defined by its |
||||
@ref GL::AbstractFramebuffer::viewport() "viewport()". Pixel format is queried |
||||
using @ref GL::AbstractFramebuffer::implementationColorReadFormat() and |
||||
@ref GL::AbstractFramebuffer::implementationColorReadType() and then mapped |
||||
back to the generic @ref Magnum::PixelFormat "PixelFormat". If, for some |
||||
reason, the driver-suggested pixel format is not desired, use the |
||||
@ref screenshot(GL::AbstractFramebuffer&, PixelFormat, const std::string&) |
||||
overload instead. |
||||
|
||||
The read pixel data are saved using the |
||||
@ref Trade::AnyImageConverter "AnyImageConverter" plugin, with format being |
||||
detected from @p filename. Note that every file format supports a different set |
||||
of pixel formats, it's the user responsibility to choose a file format that |
||||
matches the framebuffer pixel format. |
||||
|
||||
Returns @cpp true @ce on success, @cpp false @ce in case it was not possible to |
||||
map the detected pixel format back to a generic format, if either the |
||||
@ref Trade::AnyImageConverter "AnyImageConverter" or the corresponding plugin |
||||
for given file format could not be loaded, or if the file saving fails (for |
||||
example due to unsupported pixel format). A message is printed in each case. |
||||
*/ |
||||
bool MAGNUM_DEBUGTOOLS_EXPORT screenshot(GL::AbstractFramebuffer& framebuffer, const std::string& filename); |
||||
|
||||
/** @overload
|
||||
|
||||
Useful in case you already have an instance of the converter plugin manager in |
||||
your application or if you intend to save screenshots often, as the operation |
||||
doesn't involve costly dynamic library loading and unloading on every call. |
||||
*/ |
||||
bool MAGNUM_DEBUGTOOLS_EXPORT screenshot(PluginManager::Manager<Trade::AbstractImageConverter>& manager, GL::AbstractFramebuffer& framebuffer, const std::string& filename); |
||||
|
||||
/**
|
||||
@brief Save a screenshot in requested pixel format to a file |
||||
@param framebuffer Framebuffer which to read |
||||
@param format Pixel format to use |
||||
@param filename File where to save |
||||
|
||||
Similar to @ref screenshot(GL::AbstractFramebuffer&, PixelFormat, const std::string&) |
||||
but with an explicit pixel format. Useful in cases where the driver-suggested |
||||
pixel format is not desired, however note that supplying a format that's |
||||
incompatible with the framebuffer may result in GL errors. |
||||
*/ |
||||
bool MAGNUM_DEBUGTOOLS_EXPORT screenshot(GL::AbstractFramebuffer& framebuffer, PixelFormat format, const std::string& filename); |
||||
|
||||
/** @overload
|
||||
|
||||
Useful in case you already have an instance of the converter plugin manager in |
||||
your application or if you intend to save screenshots often, as the operation |
||||
doesn't involve costly dynamic library loading and unloading on every call. |
||||
*/ |
||||
bool MAGNUM_DEBUGTOOLS_EXPORT screenshot(PluginManager::Manager<Trade::AbstractImageConverter>& manager, GL::AbstractFramebuffer& framebuffer, PixelFormat format, const std::string& filename); |
||||
|
||||
}} |
||||
|
||||
#endif |
||||
@ -0,0 +1,274 @@
|
||||
/*
|
||||
This file is part of Magnum. |
||||
|
||||
Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 |
||||
Vladimír Vondruš <mosra@centrum.cz> |
||||
|
||||
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. |
||||
*/ |
||||
|
||||
#include <sstream> |
||||
#include <Corrade/Containers/ScopeGuard.h> |
||||
#include <Corrade/PluginManager/Manager.h> |
||||
#include <Corrade/Utility/Directory.h> |
||||
#include <Corrade/Utility/Format.h> |
||||
|
||||
#include "Magnum/ImageView.h" |
||||
#include "Magnum/PixelFormat.h" |
||||
#include "Magnum/DebugTools/Screenshot.h" |
||||
#include "Magnum/DebugTools/CompareImage.h" |
||||
#include "Magnum/GL/Framebuffer.h" |
||||
#include "Magnum/GL/OpenGLTester.h" |
||||
#include "Magnum/GL/PixelFormat.h" |
||||
#include "Magnum/GL/Texture.h" |
||||
#include "Magnum/GL/TextureFormat.h" |
||||
#include "Magnum/Math/Color.h" |
||||
#include "Magnum/Trade/AbstractImageConverter.h" |
||||
#include "Magnum/Trade/AbstractImporter.h" |
||||
|
||||
#ifndef MAGNUM_TARGET_WEBGL |
||||
#include "Magnum/GL/DebugOutput.h" |
||||
#endif |
||||
|
||||
#include "configure.h" |
||||
|
||||
namespace Magnum { namespace DebugTools { namespace Test { namespace { |
||||
|
||||
struct ScreenshotGLTest: GL::OpenGLTester { |
||||
explicit ScreenshotGLTest(); |
||||
|
||||
void rgba8(); |
||||
#if !defined(MAGNUM_TARGET_GLES2) || !defined(MAGNUM_TARGET_WEBGL) |
||||
void r8(); |
||||
#endif |
||||
void unknownFormat(); |
||||
void pluginLoadFailed(); |
||||
void saveFailed(); |
||||
|
||||
private: |
||||
PluginManager::Manager<Trade::AbstractImageConverter> _converterManager{"nonexistent"}; |
||||
PluginManager::Manager<Trade::AbstractImporter> _importerManager{"nonexistent"}; |
||||
}; |
||||
|
||||
ScreenshotGLTest::ScreenshotGLTest() { |
||||
addTests({&ScreenshotGLTest::rgba8, |
||||
#if !defined(MAGNUM_TARGET_GLES2) || !defined(MAGNUM_TARGET_WEBGL) |
||||
&ScreenshotGLTest::r8, |
||||
#endif |
||||
&ScreenshotGLTest::unknownFormat, |
||||
&ScreenshotGLTest::pluginLoadFailed, |
||||
&ScreenshotGLTest::saveFailed}); |
||||
|
||||
/* Load the plugins directly from the build tree. Otherwise they're either
|
||||
static and already loaded or not present in the build tree */ |
||||
#ifdef ANYIMAGECONVERTER_PLUGIN_FILENAME |
||||
CORRADE_INTERNAL_ASSERT(_converterManager.load(ANYIMAGECONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); |
||||
#endif |
||||
#ifdef TGAIMAGECONVERTER_PLUGIN_FILENAME |
||||
CORRADE_INTERNAL_ASSERT(_converterManager.load(TGAIMAGECONVERTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); |
||||
#endif |
||||
#ifdef ANYIMAGEIMPORTER_PLUGIN_FILENAME |
||||
CORRADE_INTERNAL_ASSERT(_importerManager.load(ANYIMAGEIMPORTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); |
||||
#endif |
||||
#ifdef TGAIMPORTER_PLUGIN_FILENAME |
||||
CORRADE_INTERNAL_ASSERT(_importerManager.load(TGAIMPORTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); |
||||
#endif |
||||
} |
||||
|
||||
using namespace Math::Literals; |
||||
|
||||
constexpr Color4ub DataRgba8[]{ |
||||
0x11223344_rgba, 0x22334455_rgba, 0x33445566_rgba, 0x44556677_rgba, |
||||
0x55667788_rgba, 0x66778899_rgba, 0x778899aa_rgba, 0x8899aabb_rgba, |
||||
0x99aabbcc_rgba, 0xaabbccdd_rgba, 0xbbccddee_rgba, 0xccddeeff_rgba |
||||
}; |
||||
|
||||
void ScreenshotGLTest::rgba8() { |
||||
ImageView2D rgba{PixelFormat::RGBA8Unorm, {4, 3}, DataRgba8}; |
||||
|
||||
GL::Texture2D texture; |
||||
texture.setStorage(1, |
||||
#if !defined(MAGNUM_TARGET_GLES2) || !defined(MAGNUM_TARGET_WEBGL) |
||||
GL::TextureFormat::RGBA8, |
||||
#else |
||||
GL::TextureFormat::RGBA, |
||||
#endif |
||||
{4, 3}) |
||||
.setSubImage(0, {}, rgba); |
||||
GL::Framebuffer framebuffer{{{}, {4, 3}}}; |
||||
framebuffer.attachTexture(GL::Framebuffer::ColorAttachment{0}, texture, 0); |
||||
|
||||
std::string file = Utility::Directory::join(SCREENSHOT_TEST_DIR, "image.tga"); |
||||
if(Utility::Directory::exists(file)) |
||||
CORRADE_VERIFY(Utility::Directory::rm(file)); |
||||
else |
||||
CORRADE_VERIFY(Utility::Directory::mkpath(SCREENSHOT_TEST_DIR)); |
||||
|
||||
std::ostringstream out; |
||||
bool succeeded; |
||||
{ |
||||
#ifndef MAGNUM_TARGET_WEBGL |
||||
/* Disable messages from the GL driver so we can verify our message */ |
||||
GL::DebugOutput::setCallback(nullptr, nullptr); |
||||
Containers::ScopeGuard e{GL::DebugOutput::setDefaultCallback}; |
||||
#endif |
||||
|
||||
Debug redirectOutput{&out}; |
||||
succeeded = DebugTools::screenshot(_converterManager, framebuffer, file); |
||||
} |
||||
|
||||
MAGNUM_VERIFY_NO_GL_ERROR(); |
||||
CORRADE_VERIFY(succeeded); |
||||
CORRADE_COMPARE(out.str(), |
||||
Utility::formatString("DebugTools::screenshot(): saved a PixelFormat::RGBA8Unorm image of size Vector(4, 3) to {}\n", file)); |
||||
CORRADE_COMPARE_WITH(file, rgba, CompareFileToImage{_importerManager}); |
||||
} |
||||
|
||||
#if !defined(MAGNUM_TARGET_GLES2) || !defined(MAGNUM_TARGET_WEBGL) |
||||
constexpr unsigned char DataR8[]{ |
||||
0x11, 0x22, 0x33, 0x44, |
||||
0x55, 0x66, 0x77, 0x88, |
||||
0x99, 0xaa, 0xbb, 0xcc |
||||
}; |
||||
|
||||
void ScreenshotGLTest::r8() { |
||||
ImageView2D r{PixelFormat::R8Unorm, {4, 3}, DataR8}; |
||||
|
||||
GL::Texture2D texture; |
||||
texture.setStorage(1, |
||||
#ifndef MAGNUM_TARGET_GLES2 |
||||
GL::TextureFormat::R8, |
||||
#else |
||||
GL::TextureFormat::Luminance, |
||||
#endif |
||||
{4, 3}) |
||||
.setSubImage(0, {}, r); |
||||
GL::Framebuffer framebuffer{{{}, {4, 3}}}; |
||||
framebuffer.attachTexture(GL::Framebuffer::ColorAttachment{0}, texture, 0); |
||||
|
||||
std::string file = Utility::Directory::join(SCREENSHOT_TEST_DIR, "image.tga"); |
||||
if(Utility::Directory::exists(file)) |
||||
CORRADE_VERIFY(Utility::Directory::rm(file)); |
||||
else |
||||
CORRADE_VERIFY(Utility::Directory::mkpath(SCREENSHOT_TEST_DIR)); |
||||
|
||||
std::ostringstream out; |
||||
bool succeeded; |
||||
{ |
||||
#ifndef MAGNUM_TARGET_WEBGL |
||||
/* Disable messages from the GL driver so we can verify our message */ |
||||
GL::DebugOutput::setCallback(nullptr, nullptr); |
||||
Containers::ScopeGuard e{GL::DebugOutput::setDefaultCallback}; |
||||
#endif |
||||
|
||||
Debug redirectOutput{&out}; |
||||
succeeded = DebugTools::screenshot(_converterManager, framebuffer, file); |
||||
} |
||||
|
||||
MAGNUM_VERIFY_NO_GL_ERROR(); |
||||
CORRADE_VERIFY(succeeded); |
||||
CORRADE_COMPARE(out.str(), |
||||
Utility::formatString("DebugTools::screenshot(): saved a PixelFormat::R8Unorm image of size Vector(4, 3) to {}\n", file)); |
||||
CORRADE_COMPARE_WITH(file, r, CompareFileToImage{_importerManager}); |
||||
} |
||||
#endif |
||||
|
||||
void ScreenshotGLTest::unknownFormat() { |
||||
ImageView2D rgba{GL::PixelFormat::RGB, GL::PixelType::UnsignedShort565, {4, 3}, DataRgba8}; |
||||
|
||||
GL::Texture2D texture; |
||||
texture.setStorage(1, GL::TextureFormat::RGB565, {4, 3}) |
||||
.setSubImage(0, {}, rgba); |
||||
GL::Framebuffer framebuffer{{{}, {4, 3}}}; |
||||
framebuffer.attachTexture(GL::Framebuffer::ColorAttachment{0}, texture, 0); |
||||
|
||||
std::ostringstream out; |
||||
bool succeeded; |
||||
{ |
||||
Error redirectOutput{&out}; |
||||
succeeded = DebugTools::screenshot(_converterManager, framebuffer, Utility::Directory::join(SCREENSHOT_TEST_DIR, "image.tga")); |
||||
} |
||||
|
||||
MAGNUM_VERIFY_NO_GL_ERROR(); |
||||
CORRADE_VERIFY(!succeeded); |
||||
CORRADE_COMPARE(out.str(), "DebugTools::screenshot(): can't map (GL::PixelFormat::RGB, GL::PixelType::UnsignedShort565) to a generic pixel format\n"); |
||||
} |
||||
|
||||
void ScreenshotGLTest::pluginLoadFailed() { |
||||
ImageView2D rgba{PixelFormat::RGBA8Unorm, {4, 3}, DataRgba8}; |
||||
|
||||
GL::Texture2D texture; |
||||
texture.setStorage(1, |
||||
#if !defined(MAGNUM_TARGET_GLES2) || !defined(MAGNUM_TARGET_WEBGL) |
||||
GL::TextureFormat::RGBA8, |
||||
#else |
||||
GL::TextureFormat::RGBA, |
||||
#endif |
||||
{4, 3}) |
||||
.setSubImage(0, {}, rgba); |
||||
GL::Framebuffer framebuffer{{{}, {4, 3}}}; |
||||
framebuffer.attachTexture(GL::Framebuffer::ColorAttachment{0}, texture, 0); |
||||
|
||||
std::ostringstream out; |
||||
bool succeeded; |
||||
{ |
||||
Error redirectOutput{&out}; |
||||
PluginManager::Manager<Trade::AbstractImageConverter> manager{"nowhere"}; |
||||
succeeded = DebugTools::screenshot(manager, framebuffer, Utility::Directory::join(SCREENSHOT_TEST_DIR, "image.poo")); |
||||
} |
||||
|
||||
MAGNUM_VERIFY_NO_GL_ERROR(); |
||||
CORRADE_VERIFY(!succeeded); |
||||
#ifndef CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT |
||||
CORRADE_COMPARE(out.str(), "PluginManager::Manager::load(): plugin AnyImageConverter is not static and was not found in nowhere\n"); |
||||
#else |
||||
CORRADE_COMPARE(out.str(), "PluginManager::Manager::load(): plugin AnyImageConverter was not found\n"); |
||||
#endif |
||||
} |
||||
|
||||
void ScreenshotGLTest::saveFailed() { |
||||
ImageView2D rgba{PixelFormat::RGBA8Unorm, {4, 3}, DataRgba8}; |
||||
|
||||
GL::Texture2D texture; |
||||
texture.setStorage(1, |
||||
#if !defined(MAGNUM_TARGET_GLES2) || !defined(MAGNUM_TARGET_WEBGL) |
||||
GL::TextureFormat::RGBA8, |
||||
#else |
||||
GL::TextureFormat::RGBA, |
||||
#endif |
||||
{4, 3}) |
||||
.setSubImage(0, {}, rgba); |
||||
GL::Framebuffer framebuffer{{{}, {4, 3}}}; |
||||
framebuffer.attachTexture(GL::Framebuffer::ColorAttachment{0}, texture, 0); |
||||
|
||||
std::ostringstream out; |
||||
bool succeeded; |
||||
{ |
||||
Error redirectOutput{&out}; |
||||
succeeded = DebugTools::screenshot(_converterManager, framebuffer, "image.poo"); |
||||
} |
||||
|
||||
MAGNUM_VERIFY_NO_GL_ERROR(); |
||||
CORRADE_VERIFY(!succeeded); |
||||
CORRADE_COMPARE(out.str(), "Trade::AnyImageConverter::exportToFile(): cannot determine type of file image.poo\n"); |
||||
} |
||||
|
||||
}}}} |
||||
|
||||
CORRADE_TEST_MAIN(Magnum::DebugTools::Test::ScreenshotGLTest) |
||||
Loading…
Reference in new issue