diff options
Diffstat (limited to 'src/ui/widget/canvas/texture.cpp')
-rw-r--r-- | src/ui/widget/canvas/texture.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/ui/widget/canvas/texture.cpp b/src/ui/widget/canvas/texture.cpp new file mode 100644 index 0000000..420937a --- /dev/null +++ b/src/ui/widget/canvas/texture.cpp @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +#include "texture.h" + +namespace Inkscape { +namespace UI { +namespace Widget { + +static bool have_gltexstorage() +{ + static bool result = [] { + return epoxy_gl_version() >= 42 || epoxy_has_gl_extension("GL_ARB_texture_storage"); + }(); + return result; +} + +static bool have_glinvalidateteximage() +{ + static bool result = [] { + return epoxy_gl_version() >= 43 || epoxy_has_gl_extension("ARB_invalidate_subdata"); + }(); + return result; +} + +Texture::Texture(Geom::IntPoint const &size) + : _size(size) +{ + glGenTextures(1, &_id); + glBindTexture(GL_TEXTURE_2D, _id); + + // Common flags for all textures used at the moment. + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + if (have_gltexstorage()) { + glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, size.x(), size.y()); + } else { + // Note: This fallback path is always chosen on the Mac due to Apple's crippling of OpenGL. + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, size.x(), size.y(), 0, GL_BGRA, GL_UNSIGNED_BYTE, nullptr); + } +} + +void Texture::invalidate() +{ + if (have_glinvalidateteximage()) { + glInvalidateTexImage(_id, 0); + } +} + +} // namespace Widget +} // namespace UI +} // namespace Inkscape + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 : |