Fix native RGB text on OpenGL ES 2 without BGRA extension

Angle, for instance, which is now the default on Windows,
does not support the GL_BGRA_EXT format as input for
glTexSubImage2D(). In the case where it's not detected, we
therefore need to flip the bytes in the input.

Change-Id: Ibe78d0223e3c2c39cb1943cdcf67103044d00aa7
Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
This commit is contained in:
Eskil Abrahamsen Blomfeldt 2012-11-06 12:22:39 +01:00 committed by The Qt Project
parent cf1eb70070
commit 65755f9a68
2 changed files with 19 additions and 3 deletions

View File

@ -344,6 +344,10 @@ static int qt_gl_resolve_extensions()
extensions |= QOpenGLExtensions::ElementIndexUint;
if (extensionMatcher.match("GL_OES_depth24"))
extensions |= QOpenGLExtensions::Depth24;
if (extensionMatcher.match("GL_EXT_bgra"))
extensions |= QOpenGLExtensions::BGRATextureFormat;
#else
extensions |= QOpenGLExtensions::ElementIndexUint | QOpenGLExtensions::MapBuffer;

View File

@ -42,6 +42,7 @@
#include "qopengltextureglyphcache_p.h"
#include "qopenglpaintengine_p.h"
#include "private/qopenglengineshadersource_p.h"
#include "qopenglextensions_p.h"
QT_BEGIN_NAMESPACE
@ -301,6 +302,11 @@ void QOpenGLTextureGlyphCache::fillTexture(const Coord &c, glyph_t glyph, QFixed
const int maskWidth = mask.width();
const int maskHeight = mask.height();
#if defined(QT_OPENGL_ES_2)
QOpenGLExtensions extensions(ctx);
bool hasBGRA = extensions.hasOpenGLExtension(QOpenGLExtensions::BGRATextureFormat);
#endif
if (mask.format() == QImage::Format_Mono) {
mask = mask.convertToFormat(QImage::Format_Indexed8);
for (int y = 0; y < maskHeight; ++y) {
@ -318,7 +324,14 @@ void QOpenGLTextureGlyphCache::fillTexture(const Coord &c, glyph_t glyph, QFixed
uchar g = src[x] >> 8;
uchar b = src[x];
quint32 avg = (quint32(r) + quint32(g) + quint32(b) + 1) / 3; // "+1" for rounding.
src[x] = (src[x] & 0x00ffffff) | (avg << 24);
#if defined(QT_OPENGL_ES_2)
if (!hasBGRA) {
// Reverse bytes to match GL_RGBA
src[x] = (avg << 24) | (quint32(r) << 0) | (quint32(g) << 8) | (quint32(b) << 16);
} else
#endif
src[x] = (src[x] & 0x00ffffff) | (avg << 24);
}
}
}
@ -326,8 +339,7 @@ void QOpenGLTextureGlyphCache::fillTexture(const Coord &c, glyph_t glyph, QFixed
glBindTexture(GL_TEXTURE_2D, m_textureResource->m_texture);
if (mask.format() == QImage::Format_RGB32) {
#if defined(QT_OPENGL_ES_2)
// ###TODO Ensure extension is actually present on ES2
glTexSubImage2D(GL_TEXTURE_2D, 0, c.x, c.y, maskWidth, maskHeight, GL_BGRA_EXT, GL_UNSIGNED_BYTE, mask.bits());
glTexSubImage2D(GL_TEXTURE_2D, 0, c.x, c.y, maskWidth, maskHeight, hasBGRA ? GL_BGRA_EXT : GL_RGBA, GL_UNSIGNED_BYTE, mask.bits());
#else
glTexSubImage2D(GL_TEXTURE_2D, 0, c.x, c.y, maskWidth, maskHeight, GL_BGRA, GL_UNSIGNED_BYTE, mask.bits());
#endif