From 64c5762eeb1ba41e5e0e785276c115fe04e8216b Mon Sep 17 00:00:00 2001 From: Benau Date: Sun, 18 Apr 2021 00:50:12 +0800 Subject: [PATCH] Implement updateTexture for GEGLTexture --- lib/graphics_engine/src/ge_gl_texture.cpp | 37 +++++++++++++++++++++++ lib/graphics_engine/src/ge_gl_texture.hpp | 4 ++- src/font/font_with_face.cpp | 30 +++--------------- 3 files changed, 45 insertions(+), 26 deletions(-) diff --git a/lib/graphics_engine/src/ge_gl_texture.cpp b/lib/graphics_engine/src/ge_gl_texture.cpp index 31b0fcb35..f6225ec05 100644 --- a/lib/graphics_engine/src/ge_gl_texture.cpp +++ b/lib/graphics_engine/src/ge_gl_texture.cpp @@ -166,4 +166,41 @@ void GEGLTexture::formatConversion(uint8_t* data, unsigned int* format, } } // formatConversion +//----------------------------------------------------------------------------- +void GEGLTexture::updateTexture(void* data, video::ECOLOR_FORMAT format, u32 w, + u32 h, u32 x, u32 y) +{ + glBindTexture(GL_TEXTURE_2D, m_texture_name); + + if (m_single_channel) + { + if (format == video::ECF_R8) + { + glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, GL_RED, + GL_UNSIGNED_BYTE, data); + } + } + else + { + if (format == video::ECF_R8) + { + const unsigned int size = w * h; + std::vector image_data(size * 4, 255); + uint8_t* orig_data = (uint8_t*)data; + for (unsigned int i = 0; i < size; i++) + image_data[4 * i + 3] = orig_data[i]; + glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, GL_RGBA, + GL_UNSIGNED_BYTE, image_data.data()); + } + else if (format == video::ECF_A8R8G8B8) + { + glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, GL_RGBA, + GL_UNSIGNED_BYTE, data); + } + } + if (hasMipMaps()) + glGenerateMipmap(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, 0); +} // updateTexture + } diff --git a/lib/graphics_engine/src/ge_gl_texture.hpp b/lib/graphics_engine/src/ge_gl_texture.hpp index d9313dc7a..02fecce8a 100644 --- a/lib/graphics_engine/src/ge_gl_texture.hpp +++ b/lib/graphics_engine/src/ge_gl_texture.hpp @@ -73,7 +73,9 @@ public: virtual unsigned int getTextureSize() const { return m_texture_size; } // ------------------------------------------------------------------------ virtual void reload(); - + // ------------------------------------------------------------------------ + virtual void updateTexture(void* data, irr::video::ECOLOR_FORMAT format, + u32 w, u32 h, u32 x, u32 y); }; // GEGLTexture } diff --git a/src/font/font_with_face.cpp b/src/font/font_with_face.cpp index f8f3073a1..bd502c75d 100644 --- a/src/font/font_with_face.cpp +++ b/src/font/font_with_face.cpp @@ -246,27 +246,10 @@ void FontWithFace::insertGlyph(unsigned font_number, unsigned glyph_index) if (bits->buffer != NULL && !GUIEngine::isNoGraphics()) { video::ITexture* tex = m_spritebank->getTexture(cur_tex); - glBindTexture(GL_TEXTURE_2D, tex->getTextureHandler()); if (bits->pixel_mode == FT_PIXEL_MODE_GRAY) { - if (CVS->isARBTextureSwizzleUsable() && !useColorGlyphPage()) - { - glTexSubImage2D(GL_TEXTURE_2D, 0, m_used_width, m_used_height, - bits->width, bits->rows, GL_RED, GL_UNSIGNED_BYTE, - bits->buffer); - } - else - { - const unsigned int size = bits->width * bits->rows; - uint8_t* image_data = new uint8_t[size * 4]; - memset(image_data, 255, size * 4); - for (unsigned int i = 0; i < size; i++) - image_data[4 * i + 3] = bits->buffer[i]; - glTexSubImage2D(GL_TEXTURE_2D, 0, m_used_width, m_used_height, - bits->width, bits->rows, GL_RGBA, GL_UNSIGNED_BYTE, - image_data); - delete[] image_data; - } + tex->updateTexture(bits->buffer, video::ECF_R8, bits->width, + bits->rows, m_used_width, m_used_height); } else if (bits->pixel_mode == FT_PIXEL_MODE_BGRA) { @@ -315,9 +298,9 @@ void FontWithFace::insertGlyph(unsigned font_number, unsigned glyph_index) scaled_data[i * 4] = scaled_data[i * 4 + 2]; scaled_data[i * 4 + 2] = tmp_val; } - glTexSubImage2D(GL_TEXTURE_2D, 0, m_used_width, m_used_height, - cur_glyph_width, cur_glyph_height, GL_RGBA, GL_UNSIGNED_BYTE, - scaled_data); + tex->updateTexture(scaled_data, video::ECF_A8R8G8B8, + cur_glyph_width, cur_glyph_height, m_used_width, + m_used_height); unscaled->drop(); scaled->drop(); } @@ -325,9 +308,6 @@ void FontWithFace::insertGlyph(unsigned font_number, unsigned glyph_index) { assert(false && "Invalid pixel mode"); } - if (tex->hasMipMaps()) - glGenerateMipmap(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, 0); } // Store the rectangle of current glyph