]> git.cworth.org Git - apitrace/blobdiff - gui/apitracecall.cpp
Deep copy the blob data.
[apitrace] / gui / apitracecall.cpp
index 43ec6363ab8a05e20803afdcac46d9496fff8513..f500d90c8b2f62b89a12c626a62418e5a88125c8 100644 (file)
@@ -129,10 +129,10 @@ apiVariantToString(const QVariant &variant, bool multiLine)
         return variant.value<ApiBitmask>().toString();
     }
     if (variant.canConvert<ApiStruct>()) {
-        return variant.value<ApiStruct>().toString();
+        return variant.value<ApiStruct>().toString(multiLine);
     }
     if (variant.canConvert<ApiArray>()) {
-        return variant.value<ApiArray>().toString();
+        return variant.value<ApiArray>().toString(multiLine);
     }
     if (variant.canConvert<ApiEnum>()) {
         return variant.value<ApiEnum>().toString();
@@ -208,16 +208,7 @@ void VariantVisitor::visit(Trace::Array *array)
 
 void VariantVisitor::visit(Trace::Blob *blob)
 {
-    //XXX
-    //FIXME: this is a nasty hack. Trace::Blob's can't
-    //   delete the contents in the destructor because
-    //   the data is being used by other calls. We piggy back
-    //   on that assumption and don't deep copy the data. If
-    //   Blob's will start deleting the data we will need to
-    //   start deep copying it or switch to using something like
-    //   Boost's shared_ptr or Qt's QSharedPointer to handle it
-    blob->toPointer(true);
-    QByteArray barray = QByteArray::fromRawData(blob->buf, blob->size);
+    QByteArray barray = QByteArray(blob->buf, blob->size);
     m_variant = QVariant(barray);
 }
 
@@ -353,7 +344,7 @@ ApiStruct::ApiStruct(const Trace::Struct *s)
     init(s);
 }
 
-QString ApiStruct::toString() const
+QString ApiStruct::toString(bool multiLine) const
 {
     QString str;
 
@@ -361,7 +352,7 @@ QString ApiStruct::toString() const
     for (unsigned i = 0; i < m_members.count(); ++i) {
         str += m_sig.memberNames[i] %
                QLatin1Literal(" = ") %
-               apiVariantToString(m_members[i]);
+               apiVariantToString(m_members[i], multiLine);
         if (i < m_members.count() - 1)
             str += QLatin1String(", ");
     }
@@ -400,13 +391,13 @@ QVector<QVariant> ApiArray::values() const
     return m_array;
 }
 
-QString ApiArray::toString() const
+QString ApiArray::toString(bool multiLine) const
 {
     QString str;
     str += QLatin1String("[");
     for(int i = 0; i < m_array.count(); ++i) {
         const QVariant &var = m_array[i];
-        str += apiVariantToString(var);
+        str += apiVariantToString(var, multiLine);
         if (i < m_array.count() - 1)
             str += QLatin1String(", ");
     }
@@ -537,6 +528,22 @@ const QList<ApiFramebuffer> & ApiTraceState::framebuffers() const
     return m_framebuffers;
 }
 
+ApiFramebuffer ApiTraceState::colorBuffer() const
+{
+    foreach (ApiFramebuffer fbo, m_framebuffers) {
+        if (fbo.type() == QLatin1String("GL_BACK")) {
+            return fbo;
+        }
+    }
+    foreach (ApiFramebuffer fbo, m_framebuffers) {
+        if (fbo.type() == QLatin1String("GL_FRONT")) {
+            return fbo;
+        }
+    }
+    return ApiFramebuffer();
+}
+
+
 ApiTraceCallSignature::ApiTraceCallSignature(const QString &name,
                                              const QStringList &argNames)
     : m_name(name),
@@ -929,7 +936,8 @@ ApiTraceFrame::ApiTraceFrame(ApiTrace *parentTrace)
       m_parentTrace(parentTrace),
       m_binaryDataSize(0),
       m_loaded(false),
-      m_callsToLoad(0)
+      m_callsToLoad(0),
+      m_lastCallIndex(0)
 {
 }
 
@@ -943,23 +951,23 @@ QStaticText ApiTraceFrame::staticText() const
     if (m_staticText && !m_staticText->text().isEmpty())
         return *m_staticText;
 
-    QString richText;
+    QString richText = QObject::tr(
+                "<span style=\"font-weight:bold\">Frame %1</span>"
+                "&nbsp;&nbsp;&nbsp;"
+                "<span style=\"font-style:italic;font-size:small;font-weight:lighter;\"> "
+                "(%2 calls)</span>")
+            .arg(number)
+            .arg(m_loaded ? m_calls.count() : m_callsToLoad);
 
     //mark the frame if it uploads more than a meg a frame
     if (m_binaryDataSize > (1024*1024)) {
         richText =
             QObject::tr(
-                "<span style=\"font-weight:bold;\">"
-                "Frame&nbsp;%1</span>"
+                "%1"
                 "<span style=\"font-style:italic;\">"
                 "&nbsp;&nbsp;&nbsp;&nbsp;(%2MB)</span>")
-            .arg(number)
+            .arg(richText)
             .arg(double(m_binaryDataSize / (1024.*1024.)), 0, 'g', 2);
-    } else {
-        richText =
-            QObject::tr(
-                "<span style=\"font-weight:bold\">Frame %1</span>")
-            .arg(number);
     }
 
     if (!m_staticText)
@@ -1040,9 +1048,11 @@ void ApiTraceFrame::setCalls(const QVector<ApiTraceCall*> &calls,
     m_calls = calls;
     m_binaryDataSize = binaryDataSize;
     m_loaded = true;
+    delete m_staticText;
+    m_staticText = 0;
 }
 
-bool ApiTraceFrame::loaded() const
+bool ApiTraceFrame::isLoaded() const
 {
     return m_loaded;
 }
@@ -1110,3 +1120,17 @@ ApiTraceFrame::findPrevCall(ApiTraceCall *from,
     }
     return 0;
 }
+
+void ApiTraceFrame::setLastCallIndex(unsigned index)
+{
+    m_lastCallIndex = index;
+}
+
+unsigned ApiTraceFrame::lastCallIndex() const
+{
+    if (m_loaded && !m_calls.isEmpty()) {
+        return m_calls.last()->index();
+    } else {
+        return m_lastCallIndex;
+    }
+}