From 3b9fc082c5d17d4325f17dcbb0d49d0c91ffea6c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Sun, 10 Apr 2011 19:25:01 +0100 Subject: [PATCH] Use normalized ubytes for now. glretrace doesn't have the logic to choose the most appropriate data type, nor does qapitrace have the logic to cope with multiple data types or HDR data, so make it easier on everybody by choose the common denominator. --- glstate.py | 12 +++++++----- gui/apisurface.cpp | 16 +++++++++++----- gui/apitracecall.cpp | 5 ++++- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/glstate.py b/glstate.py index 7c17a35..6469671 100644 --- a/glstate.py +++ b/glstate.py @@ -3065,12 +3065,13 @@ writeTextureImage(JSONWriter &json, GLenum target, GLint level) // Hardcoded for now, but we could chose types more adequate to the // texture internal format - json.writeStringMember("__type__", "float"); + json.writeStringMember("__type__", "uint8"); + json.writeBoolMember("__normalized__", true); json.writeNumberMember("__channels__", 4); - float *pixels = new float[depth*width*height*4]; + GLubyte *pixels = new GLubyte[depth*width*height*4]; - glGetTexImage(target, level, GL_RGBA, GL_FLOAT, pixels); + glGetTexImage(target, level, GL_RGBA, GL_UNSIGNED_BYTE, pixels); json.writeStringMember("__encoding__", "base64"); json.beginMember("__data__"); @@ -3102,10 +3103,11 @@ writeDrawBufferImage(JSONWriter &json) // Hardcoded for now, but we could chose types more adequate to the // texture internal format - json.writeStringMember("__type__", "float"); + json.writeStringMember("__type__", "uint8"); + json.writeBoolMember("__normalized__", true); json.writeNumberMember("__channels__", 4); - float *pixels = new float[width*height*4]; + GLubyte *pixels = new GLubyte[width*height*4]; GLint drawbuffer = glretrace::double_buffer ? GL_BACK : GL_FRONT; GLint readbuffer = glretrace::double_buffer ? GL_BACK : GL_FRONT; diff --git a/gui/apisurface.cpp b/gui/apisurface.cpp index 105532e..32ebff2 100644 --- a/gui/apisurface.cpp +++ b/gui/apisurface.cpp @@ -17,6 +17,12 @@ void ApiSurface::setSize(const QSize &size) m_size = size; } +static inline int +rgba8_to_argb(quint8 r, quint8 g, quint8 b, quint8 a) +{ + return (a << 24 | r << 16 | g << 8 | b); +} + static inline int rgbaf2argb(float r, float g, float b, float a) { @@ -31,7 +37,7 @@ rgbaf2argb(float r, float g, float b, float a) void ApiSurface::contentsFromBase64(const QByteArray &base64) { QByteArray dataArray = QByteArray::fromBase64(base64); - const float *data = (const float*)dataArray.data(); + const quint8 *data = (const quint8*)dataArray.data(); int width = m_size.width(); int height = m_size.height(); @@ -45,10 +51,10 @@ void ApiSurface::contentsFromBase64(const QByteArray &base64) for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { - int pixel = rgbaf2argb(data[(y * width + x) * 4 + 0], - data[(y * width + x) * 4 + 1], - data[(y * width + x) * 4 + 2], - data[(y * width + x) * 4 + 3]); + int pixel = rgba8_to_argb(data[(y * width + x) * 4 + 0], + data[(y * width + x) * 4 + 1], + data[(y * width + x) * 4 + 2], + data[(y * width + x) * 4 + 3]); pixelData[y * width + x] = pixel; } } diff --git a/gui/apitracecall.cpp b/gui/apitracecall.cpp index 351b2a9..7fabc9c 100644 --- a/gui/apitracecall.cpp +++ b/gui/apitracecall.cpp @@ -457,11 +457,14 @@ ApiTraceState::ApiTraceState(const QVariantMap &parsedJson) image[QLatin1String("__height__")].toInt()); QString cls = image[QLatin1String("__class__")].toString(); QString type = image[QLatin1String("__type__")].toString(); + bool normalized = + image[QLatin1String("__normalized__")].toBool(); int numChannels = image[QLatin1String("__channels__")].toInt(); Q_ASSERT(numChannels == 4); - Q_ASSERT(type == QLatin1String("float")); + Q_ASSERT(type == QLatin1String("uint8")); + Q_ASSERT(normalized == true); QByteArray dataArray = image[QLatin1String("__data__")].toByteArray(); -- 2.45.2