]> git.cworth.org Git - apitrace/blobdiff - gui/apisurface.cpp
Size the image widget more reasonably.
[apitrace] / gui / apisurface.cpp
index 105532e9a2c07cc9dfc5b07fca644a828382a211..c875c6ff432662fcbedc267ae41f8451034abfda 100644 (file)
@@ -17,6 +17,22 @@ void ApiSurface::setSize(const QSize &size)
     m_size = size;
 }
 
+int ApiSurface::numChannels() const
+{
+    return m_numChannels;
+}
+
+void ApiSurface::setNumChannels(int numChannels)
+{
+    m_numChannels = numChannels;
+}
+
+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 +47,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();
 
@@ -43,14 +59,28 @@ void ApiSurface::contentsFromBase64(const QByteArray &base64)
     //XXX not sure if this will work when
     //    QSysInfo::ByteOrder == QSysInfo::BigEndian
 
-    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]);
-            pixelData[y * width + x] = pixel;
+    if (m_numChannels == 4) {
+        for (int y = 0; y < height; ++y) {
+            for (int x = 0; x < width; ++x) {
+                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;
+            }
         }
+    } else if (m_numChannels == 1) {
+        for (int y = 0; y < height; ++y) {
+            for (int x = 0; x < width; ++x) {
+                int pixel = rgba8_to_argb(data[y * width + x],
+                                          data[y * width + x],
+                                          data[y * width + x],
+                                          255);
+                pixelData[y * width + x] = pixel;
+            }
+        }
+    } else {
+        Q_ASSERT(0);
     }
 
     m_image = QImage((uchar*)pixelData,
@@ -108,3 +138,18 @@ void ApiTexture::setLevel(int l)
 {
     m_level = l;
 }
+
+ApiFramebuffer::ApiFramebuffer()
+    : ApiSurface()
+{
+}
+
+QString ApiFramebuffer::type() const
+{
+    return m_type;
+}
+
+void ApiFramebuffer::setType(const QString &str)
+{
+    m_type = str;
+}