blob: 57d2d86eb23c48bc37f75bdbbc69c9ab7a5dc197 [file] [log] [blame]
Zack Rusin91065372011-03-26 01:54:10 -04001#include "apitracecall.h"
2
Zack Rusin661842d2011-04-17 01:59:16 -04003#include "apitrace.h"
Zack Rusinebf971e2011-09-06 17:44:43 -04004#include "traceloader.h"
Zack Rusin91065372011-03-26 01:54:10 -04005#include "trace_model.hpp"
6
7#include <QDebug>
Zack Rusin9e292fc2011-04-26 23:03:42 -04008#include <QLocale>
Zack Rusin35451522011-04-02 23:44:53 -04009#include <QObject>
Zack Rusin5e277b02011-04-16 21:52:26 -040010#define QT_USE_FAST_OPERATOR_PLUS
11#include <QStringBuilder>
José Fonsecae8a1aa92011-04-21 09:13:23 +010012#include <QTextDocument>
Zack Rusin91065372011-03-26 01:54:10 -040013
Zack Rusinb53b1612011-04-19 01:33:58 -040014const char * const styleSheet =
15 ".call {\n"
16 " font-weight:bold;\n"
17 // text shadow looks great but doesn't work well in qtwebkit 4.7
18 " /*text-shadow: 0px 2px 3px #555;*/\n"
Zack Rusin5a74d3c2011-11-16 23:52:15 -050019 " font-size: 1.1em;\n"
Zack Rusinb53b1612011-04-19 01:33:58 -040020 "}\n"
21 ".arg-name {\n"
22 " border: 1px solid rgb(238,206,0);\n"
23 " border-radius: 4px;\n"
24 " background: yellow;\n"
25 " padding: 2px;\n"
26 " box-shadow: 0px 1px 3px dimgrey;\n"
27 " -webkit-transition: background 1s linear;\n"
28 "}\n"
29 ".arg-name:hover {\n"
30 " background: white;\n"
31 "}\n"
32 ".arg-value {\n"
33 " color: #0000ff;\n"
34 "}\n"
35 ".error {\n"
Zack Rusincc0b4912011-04-19 01:59:20 -040036 " border: 1px solid rgb(255,0,0);\n"
Zack Rusinb53b1612011-04-19 01:33:58 -040037 " margin: 10px;\n"
Zack Rusincc0b4912011-04-19 01:59:20 -040038 " padding: 1;\n"
39 " border-radius: 4px;\n"
40 // also looks great but qtwebkit doesn't support it
41 //" background: #6fb2e5;\n"
42 //" box-shadow: 0 1px 5px #0061aa, inset 0 10px 20px #b6f9ff;\n"
43 //" -o-box-shadow: 0 1px 5px #0061aa, inset 0 10px 20px #b6f9ff;\n"
44 //" -webkit-box-shadow: 0 1px 5px #0061aa, inset 0 10px 20px #b6f9ff;\n"
45 //" -moz-box-shadow: 0 1px 5px #0061aa, inset 0 10px 20px #b6f9ff;\n"
Zack Rusinb53b1612011-04-19 01:33:58 -040046 "}\n";
47
Zack Rusin91065372011-03-26 01:54:10 -040048
José Fonsecae8a1aa92011-04-21 09:13:23 +010049// Qt::convertFromPlainText doesn't do precisely what we want
50static QString
51plainTextToHTML(const QString & plain, bool multiLine)
52{
53 int col = 0;
54 bool quote = false;
55 QString rich;
56 for (int i = 0; i < plain.length(); ++i) {
57 if (plain[i] == QLatin1Char('\n')){
58 if (multiLine) {
59 rich += QLatin1String("<br>\n");
60 } else {
61 rich += QLatin1String("\\n");
62 }
63 col = 0;
64 quote = true;
65 } else {
66 if (plain[i] == QLatin1Char('\t')){
67 if (multiLine) {
68 rich += QChar(0x00a0U);
69 ++col;
70 while (col % 8) {
71 rich += QChar(0x00a0U);
72 ++col;
73 }
74 } else {
75 rich += QLatin1String("\\t");
76 }
77 quote = true;
78 } else if (plain[i].isSpace()) {
79 rich += QChar(0x00a0U);
80 quote = true;
81 } else if (plain[i] == QLatin1Char('<')) {
82 rich += QLatin1String("&lt;");
83 } else if (plain[i] == QLatin1Char('>')) {
84 rich += QLatin1String("&gt;");
85 } else if (plain[i] == QLatin1Char('&')) {
86 rich += QLatin1String("&amp;");
87 } else {
88 rich += plain[i];
89 }
90 ++col;
91 }
92 }
93
94 if (quote) {
95 return QLatin1Literal("\"") + rich + QLatin1Literal("\"");
96 }
97
98 return rich;
99}
100
Zack Rusina1a3ad52011-08-27 19:19:18 -0400101QString
102apiVariantToString(const QVariant &variant, bool multiLine)
Zack Rusin91065372011-03-26 01:54:10 -0400103{
José Fonseca1fa61832011-11-05 08:50:25 +0000104 if (variant.isNull()) {
105 return QLatin1String("?");
106 }
107
José Fonsecaea4b99f2011-11-25 13:37:37 +0000108 if (variant.userType() == QMetaType::Float) {
Zack Rusin91065372011-03-26 01:54:10 -0400109 return QString::number(variant.toFloat());
110 }
José Fonsecaea4b99f2011-11-25 13:37:37 +0000111 if (variant.userType() == QVariant::Double) {
112 return QString::number(variant.toDouble());
113 }
Zack Rusin35451522011-04-02 23:44:53 -0400114 if (variant.userType() == QVariant::ByteArray) {
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400115 if (variant.toByteArray().size() < 1024) {
116 int bytes = variant.toByteArray().size();
117 return QObject::tr("[binary data, size = %1 bytes]").arg(bytes);
118 } else {
119 float kb = variant.toByteArray().size()/1024.;
120 return QObject::tr("[binary data, size = %1 kb]").arg(kb);
121 }
Zack Rusin35451522011-04-02 23:44:53 -0400122 }
Zack Rusin91065372011-03-26 01:54:10 -0400123
José Fonsecae8a1aa92011-04-21 09:13:23 +0100124 if (variant.userType() == QVariant::String) {
125 return plainTextToHTML(variant.toString(), multiLine);
126 }
127
Zack Rusin91065372011-03-26 01:54:10 -0400128 if (variant.userType() < QVariant::UserType) {
129 return variant.toString();
130 }
131
132 if (variant.canConvert<ApiPointer>()) {
133 return variant.value<ApiPointer>().toString();
134 }
135 if (variant.canConvert<ApiBitmask>()) {
136 return variant.value<ApiBitmask>().toString();
137 }
138 if (variant.canConvert<ApiStruct>()) {
José Fonsecaa596a9e2011-09-27 10:19:28 +0100139 return variant.value<ApiStruct>().toString(multiLine);
Zack Rusin91065372011-03-26 01:54:10 -0400140 }
141 if (variant.canConvert<ApiArray>()) {
José Fonsecaa596a9e2011-09-27 10:19:28 +0100142 return variant.value<ApiArray>().toString(multiLine);
Zack Rusin91065372011-03-26 01:54:10 -0400143 }
Zack Rusind54055e2011-04-17 18:27:28 -0400144 if (variant.canConvert<ApiEnum>()) {
145 return variant.value<ApiEnum>().toString();
146 }
Zack Rusin91065372011-03-26 01:54:10 -0400147
148 return QString();
149}
150
Zack Rusina1a3ad52011-08-27 19:19:18 -0400151
José Fonsecab4a3d142011-10-27 07:43:19 +0100152void VariantVisitor::visit(trace::Null *)
Zack Rusina1a3ad52011-08-27 19:19:18 -0400153{
154 m_variant = QVariant::fromValue(ApiPointer(0));
155}
156
José Fonsecab4a3d142011-10-27 07:43:19 +0100157void VariantVisitor::visit(trace::Bool *node)
Zack Rusina1a3ad52011-08-27 19:19:18 -0400158{
159 m_variant = QVariant(node->value);
160}
161
José Fonsecab4a3d142011-10-27 07:43:19 +0100162void VariantVisitor::visit(trace::SInt *node)
Zack Rusina1a3ad52011-08-27 19:19:18 -0400163{
164 m_variant = QVariant(node->value);
165}
166
José Fonsecab4a3d142011-10-27 07:43:19 +0100167void VariantVisitor::visit(trace::UInt *node)
Zack Rusina1a3ad52011-08-27 19:19:18 -0400168{
169 m_variant = QVariant(node->value);
170}
171
José Fonsecab4a3d142011-10-27 07:43:19 +0100172void VariantVisitor::visit(trace::Float *node)
Zack Rusina1a3ad52011-08-27 19:19:18 -0400173{
174 m_variant = QVariant(node->value);
175}
176
Carl Worthe935ee12011-11-17 14:04:16 -0800177void VariantVisitor::visit(trace::Double *node)
178{
179 m_variant = QVariant(node->value);
180}
181
José Fonsecab4a3d142011-10-27 07:43:19 +0100182void VariantVisitor::visit(trace::String *node)
Zack Rusina1a3ad52011-08-27 19:19:18 -0400183{
184 m_variant = QVariant(QString::fromStdString(node->value));
185}
186
José Fonsecab4a3d142011-10-27 07:43:19 +0100187void VariantVisitor::visit(trace::Enum *e)
Zack Rusina1a3ad52011-08-27 19:19:18 -0400188{
Zack Rusin35c27932011-08-28 21:16:22 -0400189 ApiTraceEnumSignature *sig = 0;
Zack Rusina1a3ad52011-08-27 19:19:18 -0400190
Zack Rusinebf971e2011-09-06 17:44:43 -0400191 if (m_loader) {
192 sig = m_loader->enumSignature(e->sig->id);
Zack Rusin35c27932011-08-28 21:16:22 -0400193 }
194 if (!sig) {
José Fonsecaeb644512011-12-11 10:33:55 +0000195 sig = new ApiTraceEnumSignature(e->sig);
Zack Rusinebf971e2011-09-06 17:44:43 -0400196 if (m_loader) {
197 m_loader->addEnumSignature(e->sig->id, sig);
Zack Rusin35c27932011-08-28 21:16:22 -0400198 }
199 }
200
José Fonsecaeb644512011-12-11 10:33:55 +0000201 m_variant = QVariant::fromValue(ApiEnum(sig, e->value));
Zack Rusina1a3ad52011-08-27 19:19:18 -0400202}
203
José Fonsecab4a3d142011-10-27 07:43:19 +0100204void VariantVisitor::visit(trace::Bitmask *bitmask)
Zack Rusina1a3ad52011-08-27 19:19:18 -0400205{
206 m_variant = QVariant::fromValue(ApiBitmask(bitmask));
207}
208
José Fonsecab4a3d142011-10-27 07:43:19 +0100209void VariantVisitor::visit(trace::Struct *str)
Zack Rusina1a3ad52011-08-27 19:19:18 -0400210{
211 m_variant = QVariant::fromValue(ApiStruct(str));
212}
213
José Fonsecab4a3d142011-10-27 07:43:19 +0100214void VariantVisitor::visit(trace::Array *array)
Zack Rusina1a3ad52011-08-27 19:19:18 -0400215{
216 m_variant = QVariant::fromValue(ApiArray(array));
217}
218
José Fonsecab4a3d142011-10-27 07:43:19 +0100219void VariantVisitor::visit(trace::Blob *blob)
Zack Rusina1a3ad52011-08-27 19:19:18 -0400220{
Zack Rusin95237682011-09-27 12:04:10 -0400221 QByteArray barray = QByteArray(blob->buf, blob->size);
Zack Rusina1a3ad52011-08-27 19:19:18 -0400222 m_variant = QVariant(barray);
223}
224
José Fonsecab4a3d142011-10-27 07:43:19 +0100225void VariantVisitor::visit(trace::Pointer *ptr)
Zack Rusina1a3ad52011-08-27 19:19:18 -0400226{
227 m_variant = QVariant::fromValue(ApiPointer(ptr->value));
228}
229
José Fonsecaeb644512011-12-11 10:33:55 +0000230ApiTraceEnumSignature::ApiTraceEnumSignature(const trace::EnumSig *sig)
231{
232 for (const trace::EnumValue *it = sig->values;
233 it != sig->values + sig->num_values; ++it) {
234 QPair<QString, signed long long> pair;
Zack Rusina1a3ad52011-08-27 19:19:18 -0400235
José Fonsecaeb644512011-12-11 10:33:55 +0000236 pair.first = QString::fromStdString(it->name);
237 pair.second = it->value;
238
239 m_names.append(pair);
240 }
241}
242
243QString ApiTraceEnumSignature::name(signed long long value) const
244{
245 for (ValueList::const_iterator it = m_names.begin();
246 it != m_names.end(); ++it) {
247 if (value == it->second) {
248 return it->first;
249 }
250 }
251 return QString::fromLatin1("%1").arg(value);
252}
253
254ApiEnum::ApiEnum(ApiTraceEnumSignature *sig, signed long long value)
255 : m_sig(sig), m_value(value)
Zack Rusina1a3ad52011-08-27 19:19:18 -0400256{
257}
258
259QString ApiEnum::toString() const
260{
Zack Rusin35c27932011-08-28 21:16:22 -0400261 if (m_sig) {
José Fonsecaeb644512011-12-11 10:33:55 +0000262 return m_sig->name(m_value);
Zack Rusin35c27932011-08-28 21:16:22 -0400263 }
264 Q_ASSERT(!"should never happen");
265 return QString();
Zack Rusina1a3ad52011-08-27 19:19:18 -0400266}
267
268QVariant ApiEnum::value() const
269{
Zack Rusin35c27932011-08-28 21:16:22 -0400270 if (m_sig) {
José Fonsecaeb644512011-12-11 10:33:55 +0000271 return QVariant::fromValue(m_value);
Zack Rusin35c27932011-08-28 21:16:22 -0400272 }
273 Q_ASSERT(!"should never happen");
274 return QVariant();
Zack Rusina1a3ad52011-08-27 19:19:18 -0400275}
276
277QString ApiEnum::name() const
278{
Zack Rusin35c27932011-08-28 21:16:22 -0400279 if (m_sig) {
José Fonsecaeb644512011-12-11 10:33:55 +0000280 return m_sig->name(m_value);
Zack Rusin35c27932011-08-28 21:16:22 -0400281 }
282 Q_ASSERT(!"should never happen");
283 return QString();
Zack Rusina1a3ad52011-08-27 19:19:18 -0400284}
285
286unsigned long long ApiBitmask::value() const
287{
288 return m_value;
289}
290
291ApiBitmask::Signature ApiBitmask::signature() const
292{
293 return m_sig;
294}
295
296ApiStruct::Signature ApiStruct::signature() const
297{
298 return m_sig;
299}
300
301QList<QVariant> ApiStruct::values() const
302{
303 return m_members;
304}
305
306ApiPointer::ApiPointer(unsigned long long val)
307 : m_value(val)
308{
309}
310
311
312unsigned long long ApiPointer::value() const
313{
314 return m_value;
315}
316
317QString ApiPointer::toString() const
318{
319 if (m_value)
320 return QString("0x%1").arg(m_value, 0, 16);
321 else
322 return QLatin1String("NULL");
323}
324
José Fonsecab4a3d142011-10-27 07:43:19 +0100325ApiBitmask::ApiBitmask(const trace::Bitmask *bitmask)
Zack Rusin91065372011-03-26 01:54:10 -0400326 : m_value(0)
327{
328 init(bitmask);
329}
330
José Fonsecab4a3d142011-10-27 07:43:19 +0100331void ApiBitmask::init(const trace::Bitmask *bitmask)
Zack Rusin91065372011-03-26 01:54:10 -0400332{
333 if (!bitmask)
334 return;
335
336 m_value = bitmask->value;
José Fonsecab4a3d142011-10-27 07:43:19 +0100337 for (const trace::BitmaskFlag *it = bitmask->sig->flags;
José Fonsecafcfbf172011-05-28 13:20:01 +0100338 it != bitmask->sig->flags + bitmask->sig->num_flags; ++it) {
José Fonseca31b183a2011-05-28 12:21:15 +0100339 assert(it->value);
Zack Rusin91065372011-03-26 01:54:10 -0400340 QPair<QString, unsigned long long> pair;
341
José Fonseca31b183a2011-05-28 12:21:15 +0100342 pair.first = QString::fromStdString(it->name);
343 pair.second = it->value;
Zack Rusin91065372011-03-26 01:54:10 -0400344
345 m_sig.append(pair);
346 }
347}
348
349QString ApiBitmask::toString() const
350{
351 QString str;
352 unsigned long long value = m_value;
353 bool first = true;
354 for (Signature::const_iterator it = m_sig.begin();
355 value != 0 && it != m_sig.end(); ++it) {
356 Q_ASSERT(it->second);
357 if ((value & it->second) == it->second) {
358 if (!first) {
359 str += QLatin1String(" | ");
360 }
361 str += it->first;
362 value &= ~it->second;
363 first = false;
364 }
365 }
366 if (value || first) {
367 if (!first) {
368 str += QLatin1String(" | ");
369 }
370 str += QString::fromLatin1("0x%1").arg(value, 0, 16);
371 }
372 return str;
373}
374
José Fonsecab4a3d142011-10-27 07:43:19 +0100375ApiStruct::ApiStruct(const trace::Struct *s)
Zack Rusin91065372011-03-26 01:54:10 -0400376{
377 init(s);
378}
379
José Fonsecaa596a9e2011-09-27 10:19:28 +0100380QString ApiStruct::toString(bool multiLine) const
Zack Rusin91065372011-03-26 01:54:10 -0400381{
382 QString str;
383
384 str += QLatin1String("{");
385 for (unsigned i = 0; i < m_members.count(); ++i) {
Zack Rusin5e277b02011-04-16 21:52:26 -0400386 str += m_sig.memberNames[i] %
387 QLatin1Literal(" = ") %
José Fonsecaa596a9e2011-09-27 10:19:28 +0100388 apiVariantToString(m_members[i], multiLine);
Zack Rusin91065372011-03-26 01:54:10 -0400389 if (i < m_members.count() - 1)
390 str += QLatin1String(", ");
391 }
392 str += QLatin1String("}");
393
394 return str;
395}
396
José Fonsecab4a3d142011-10-27 07:43:19 +0100397void ApiStruct::init(const trace::Struct *s)
Zack Rusin91065372011-03-26 01:54:10 -0400398{
399 if (!s)
400 return;
401
402 m_sig.name = QString::fromStdString(s->sig->name);
José Fonseca1b23ed22011-05-28 13:01:16 +0100403 for (unsigned i = 0; i < s->sig->num_members; ++i) {
Zack Rusin35c27932011-08-28 21:16:22 -0400404 VariantVisitor vis(0);
Zack Rusin91065372011-03-26 01:54:10 -0400405 m_sig.memberNames.append(
406 QString::fromStdString(s->sig->member_names[i]));
407 s->members[i]->visit(vis);
408 m_members.append(vis.variant());
409 }
410}
411
José Fonsecab4a3d142011-10-27 07:43:19 +0100412ApiArray::ApiArray(const trace::Array *arr)
Zack Rusin91065372011-03-26 01:54:10 -0400413{
414 init(arr);
415}
416
Zack Rusin77ff98a2011-08-28 22:30:35 -0400417ApiArray::ApiArray(const QVector<QVariant> &vals)
Zack Rusinabb3fde2011-04-16 02:16:49 -0400418 : m_array(vals)
419{
420}
421
Zack Rusin77ff98a2011-08-28 22:30:35 -0400422QVector<QVariant> ApiArray::values() const
Zack Rusina1a3ad52011-08-27 19:19:18 -0400423{
424 return m_array;
425}
426
José Fonsecaa596a9e2011-09-27 10:19:28 +0100427QString ApiArray::toString(bool multiLine) const
Zack Rusin91065372011-03-26 01:54:10 -0400428{
429 QString str;
430 str += QLatin1String("[");
431 for(int i = 0; i < m_array.count(); ++i) {
432 const QVariant &var = m_array[i];
José Fonsecaa596a9e2011-09-27 10:19:28 +0100433 str += apiVariantToString(var, multiLine);
Zack Rusin91065372011-03-26 01:54:10 -0400434 if (i < m_array.count() - 1)
435 str += QLatin1String(", ");
436 }
437 str += QLatin1String("]");
438
439 return str;
440}
441
José Fonsecab4a3d142011-10-27 07:43:19 +0100442void ApiArray::init(const trace::Array *arr)
Zack Rusin91065372011-03-26 01:54:10 -0400443{
444 if (!arr)
445 return;
446
Zack Rusin3c70dbf2011-08-28 03:10:01 -0400447 m_array.reserve(arr->values.size());
Zack Rusin91065372011-03-26 01:54:10 -0400448 for (int i = 0; i < arr->values.size(); ++i) {
Zack Rusin35c27932011-08-28 21:16:22 -0400449 VariantVisitor vis(0);
Zack Rusin91065372011-03-26 01:54:10 -0400450 arr->values[i]->visit(vis);
451
452 m_array.append(vis.variant());
453 }
Zack Rusin77ff98a2011-08-28 22:30:35 -0400454 m_array.squeeze();
Zack Rusin91065372011-03-26 01:54:10 -0400455}
Zack Rusin18eade52011-03-26 14:23:35 -0400456
Zack Rusina1a3ad52011-08-27 19:19:18 -0400457ApiTraceState::ApiTraceState()
458{
459}
460
461ApiTraceState::ApiTraceState(const QVariantMap &parsedJson)
462{
463 m_parameters = parsedJson[QLatin1String("parameters")].toMap();
464 QVariantMap attachedShaders =
465 parsedJson[QLatin1String("shaders")].toMap();
466 QVariantMap::const_iterator itr;
467
468
469 for (itr = attachedShaders.constBegin(); itr != attachedShaders.constEnd();
470 ++itr) {
471 QString type = itr.key();
472 QString source = itr.value().toString();
473 m_shaderSources[type] = source;
474 }
475
476 m_uniforms = parsedJson[QLatin1String("uniforms")].toMap();
477
478 QVariantMap textures =
479 parsedJson[QLatin1String("textures")].toMap();
480 for (itr = textures.constBegin(); itr != textures.constEnd(); ++itr) {
481 QVariantMap image = itr.value().toMap();
482 QSize size(image[QLatin1String("__width__")].toInt(),
483 image[QLatin1String("__height__")].toInt());
484 QString cls = image[QLatin1String("__class__")].toString();
485 QString type = image[QLatin1String("__type__")].toString();
486 bool normalized =
487 image[QLatin1String("__normalized__")].toBool();
488 int numChannels =
489 image[QLatin1String("__channels__")].toInt();
Zack Rusinb25c4b92011-11-16 22:43:34 -0500490 int depth =
491 image[QLatin1String("__depth__")].toInt();
Zack Rusine181b992011-11-17 16:00:41 -0500492 QString formatName =
493 image[QLatin1String("__format__")].toString();
Zack Rusina1a3ad52011-08-27 19:19:18 -0400494
495 Q_ASSERT(type == QLatin1String("uint8"));
496 Q_ASSERT(normalized == true);
Zack Rusindf95ce02011-08-27 19:46:16 -0400497 Q_UNUSED(normalized);
Zack Rusina1a3ad52011-08-27 19:19:18 -0400498
499 QByteArray dataArray =
500 image[QLatin1String("__data__")].toByteArray();
501
502 ApiTexture tex;
503 tex.setSize(size);
Zack Rusinb25c4b92011-11-16 22:43:34 -0500504 tex.setDepth(depth);
Zack Rusine181b992011-11-17 16:00:41 -0500505 tex.setFormatName(formatName);
Zack Rusina1a3ad52011-08-27 19:19:18 -0400506 tex.setNumChannels(numChannels);
507 tex.setLabel(itr.key());
508 tex.contentsFromBase64(dataArray);
509
510 m_textures.append(tex);
511 }
512
513 QVariantMap fbos =
514 parsedJson[QLatin1String("framebuffer")].toMap();
515 for (itr = fbos.constBegin(); itr != fbos.constEnd(); ++itr) {
516 QVariantMap buffer = itr.value().toMap();
517 QSize size(buffer[QLatin1String("__width__")].toInt(),
518 buffer[QLatin1String("__height__")].toInt());
519 QString cls = buffer[QLatin1String("__class__")].toString();
520 QString type = buffer[QLatin1String("__type__")].toString();
521 bool normalized = buffer[QLatin1String("__normalized__")].toBool();
522 int numChannels = buffer[QLatin1String("__channels__")].toInt();
Zack Rusinb25c4b92011-11-16 22:43:34 -0500523 int depth = buffer[QLatin1String("__depth__")].toInt();
Zack Rusine181b992011-11-17 16:00:41 -0500524 QString formatName = buffer[QLatin1String("__format__")].toString();
Zack Rusina1a3ad52011-08-27 19:19:18 -0400525
526 Q_ASSERT(type == QLatin1String("uint8"));
527 Q_ASSERT(normalized == true);
Zack Rusindf95ce02011-08-27 19:46:16 -0400528 Q_UNUSED(normalized);
Zack Rusina1a3ad52011-08-27 19:19:18 -0400529
530 QByteArray dataArray =
531 buffer[QLatin1String("__data__")].toByteArray();
532
533 ApiFramebuffer fbo;
534 fbo.setSize(size);
Zack Rusinb25c4b92011-11-16 22:43:34 -0500535 fbo.setDepth(depth);
Zack Rusine181b992011-11-17 16:00:41 -0500536 fbo.setFormatName(formatName);
Zack Rusina1a3ad52011-08-27 19:19:18 -0400537 fbo.setNumChannels(numChannels);
538 fbo.setType(itr.key());
539 fbo.contentsFromBase64(dataArray);
540 m_framebuffers.append(fbo);
541 }
542}
543
544const QVariantMap & ApiTraceState::parameters() const
545{
546 return m_parameters;
547}
548
549const QMap<QString, QString> & ApiTraceState::shaderSources() const
550{
551 return m_shaderSources;
552}
553
554const QVariantMap & ApiTraceState::uniforms() const
555{
556 return m_uniforms;
557}
558
559bool ApiTraceState::isEmpty() const
560{
561 return m_parameters.isEmpty();
562}
563
564const QList<ApiTexture> & ApiTraceState::textures() const
565{
566 return m_textures;
567}
568
569const QList<ApiFramebuffer> & ApiTraceState::framebuffers() const
570{
571 return m_framebuffers;
572}
573
Zack Rusin353f0532011-09-15 20:23:27 -0400574ApiFramebuffer ApiTraceState::colorBuffer() const
575{
576 foreach (ApiFramebuffer fbo, m_framebuffers) {
577 if (fbo.type() == QLatin1String("GL_BACK")) {
578 return fbo;
579 }
580 }
581 foreach (ApiFramebuffer fbo, m_framebuffers) {
582 if (fbo.type() == QLatin1String("GL_FRONT")) {
583 return fbo;
584 }
585 }
586 return ApiFramebuffer();
587}
588
589
Zack Rusinac4dd9a2011-08-28 00:38:13 -0400590ApiTraceCallSignature::ApiTraceCallSignature(const QString &name,
591 const QStringList &argNames)
592 : m_name(name),
593 m_argNames(argNames)
594{
595}
596
597ApiTraceCallSignature::~ApiTraceCallSignature()
598{
599}
600
601QUrl ApiTraceCallSignature::helpUrl() const
602{
603 return m_helpUrl;
604}
605
606void ApiTraceCallSignature::setHelpUrl(const QUrl &url)
607{
608 m_helpUrl = url;
609}
610
Zack Rusina1a3ad52011-08-27 19:19:18 -0400611ApiTraceEvent::ApiTraceEvent()
612 : m_type(ApiTraceEvent::None),
Zack Rusined40bc62011-08-28 17:11:02 -0400613 m_hasBinaryData(false),
614 m_binaryDataIndex(0),
615 m_state(0),
Zack Rusina1a3ad52011-08-27 19:19:18 -0400616 m_staticText(0)
617{
618}
619
620ApiTraceEvent::ApiTraceEvent(Type t)
621 : m_type(t),
Zack Rusined40bc62011-08-28 17:11:02 -0400622 m_hasBinaryData(false),
623 m_binaryDataIndex(0),
624 m_state(0),
Zack Rusina1a3ad52011-08-27 19:19:18 -0400625 m_staticText(0)
626{
627}
628
629ApiTraceEvent::~ApiTraceEvent()
630{
Zack Rusined40bc62011-08-28 17:11:02 -0400631 delete m_state;
Zack Rusina1a3ad52011-08-27 19:19:18 -0400632 delete m_staticText;
633}
634
635QVariantMap ApiTraceEvent::stateParameters() const
636{
Zack Rusined40bc62011-08-28 17:11:02 -0400637 if (m_state) {
638 return m_state->parameters();
639 } else {
640 return QVariantMap();
641 }
Zack Rusina1a3ad52011-08-27 19:19:18 -0400642}
643
Zack Rusined40bc62011-08-28 17:11:02 -0400644ApiTraceState *ApiTraceEvent::state() const
Zack Rusina1a3ad52011-08-27 19:19:18 -0400645{
646 return m_state;
647}
648
Zack Rusined40bc62011-08-28 17:11:02 -0400649void ApiTraceEvent::setState(ApiTraceState *state)
Zack Rusina1a3ad52011-08-27 19:19:18 -0400650{
651 m_state = state;
652}
653
Zack Rusinebf971e2011-09-06 17:44:43 -0400654ApiTraceCall::ApiTraceCall(ApiTraceFrame *parentFrame,
655 TraceLoader *loader,
José Fonsecab4a3d142011-10-27 07:43:19 +0100656 const trace::Call *call)
Zack Rusina1a3ad52011-08-27 19:19:18 -0400657 : ApiTraceEvent(ApiTraceEvent::Call),
Zack Rusined40bc62011-08-28 17:11:02 -0400658 m_parentFrame(parentFrame)
Zack Rusina1a3ad52011-08-27 19:19:18 -0400659{
Zack Rusina1a3ad52011-08-27 19:19:18 -0400660 m_index = call->no;
661
Zack Rusinebf971e2011-09-06 17:44:43 -0400662 m_signature = loader->signature(call->sig->id);
Zack Rusinac4dd9a2011-08-28 00:38:13 -0400663
664 if (!m_signature) {
Zack Rusinb31e2142011-08-28 19:38:00 -0400665 QString name = QString::fromStdString(call->sig->name);
Zack Rusinac4dd9a2011-08-28 00:38:13 -0400666 QStringList argNames;
Zack Rusinf22d7992011-08-28 02:23:47 -0400667 argNames.reserve(call->sig->num_args);
Zack Rusinac4dd9a2011-08-28 00:38:13 -0400668 for (int i = 0; i < call->sig->num_args; ++i) {
Zack Rusinf22d7992011-08-28 02:23:47 -0400669 argNames += QString::fromStdString(call->sig->arg_names[i]);
Zack Rusinac4dd9a2011-08-28 00:38:13 -0400670 }
671 m_signature = new ApiTraceCallSignature(name, argNames);
Zack Rusinebf971e2011-09-06 17:44:43 -0400672 loader->addSignature(call->sig->id, m_signature);
Zack Rusina1a3ad52011-08-27 19:19:18 -0400673 }
674 if (call->ret) {
Zack Rusinebf971e2011-09-06 17:44:43 -0400675 VariantVisitor retVisitor(loader);
Zack Rusina1a3ad52011-08-27 19:19:18 -0400676 call->ret->visit(retVisitor);
677 m_returnValue = retVisitor.variant();
678 }
Zack Rusinf22d7992011-08-28 02:23:47 -0400679 m_argValues.reserve(call->args.size());
Zack Rusina1a3ad52011-08-27 19:19:18 -0400680 for (int i = 0; i < call->args.size(); ++i) {
José Fonseca1fa61832011-11-05 08:50:25 +0000681 if (call->args[i]) {
682 VariantVisitor argVisitor(loader);
683 call->args[i]->visit(argVisitor);
684 m_argValues.append(argVisitor.variant());
685 if (m_argValues[i].type() == QVariant::ByteArray) {
686 m_hasBinaryData = true;
687 m_binaryDataIndex = i;
688 }
689 } else {
690 m_argValues.append(QVariant());
Zack Rusina1a3ad52011-08-27 19:19:18 -0400691 }
692 }
Zack Rusinf736a622011-08-28 22:19:46 -0400693 m_argValues.squeeze();
José Fonseca340f5692011-11-30 07:04:44 +0000694 m_flags = call->flags;
Zack Rusina1a3ad52011-08-27 19:19:18 -0400695}
696
697ApiTraceCall::~ApiTraceCall()
698{
699}
700
701
702bool ApiTraceCall::hasError() const
703{
704 return !m_error.isEmpty();
705}
706
707QString ApiTraceCall::error() const
708{
709 return m_error;
710}
711
712void ApiTraceCall::setError(const QString &msg)
713{
714 if (m_error != msg) {
Zack Rusina1a3ad52011-08-27 19:19:18 -0400715 m_error = msg;
716 m_richText = QString();
Zack Rusina1a3ad52011-08-27 19:19:18 -0400717 }
718}
719
720ApiTrace * ApiTraceCall::parentTrace() const
721{
722 if (m_parentFrame)
723 return m_parentFrame->parentTrace();
724 return NULL;
725}
726
Zack Rusinf736a622011-08-28 22:19:46 -0400727QVector<QVariant> ApiTraceCall::originalValues() const
Zack Rusina1a3ad52011-08-27 19:19:18 -0400728{
729 return m_argValues;
730}
731
Zack Rusinf736a622011-08-28 22:19:46 -0400732void ApiTraceCall::setEditedValues(const QVector<QVariant> &lst)
Zack Rusina1a3ad52011-08-27 19:19:18 -0400733{
734 ApiTrace *trace = parentTrace();
735
736 m_editedValues = lst;
737 //lets regenerate data
738 m_richText = QString();
Zack Rusindc792082011-08-27 23:29:19 -0400739 m_searchText = QString();
Zack Rusina1a3ad52011-08-27 19:19:18 -0400740 delete m_staticText;
741 m_staticText = 0;
742
743 if (trace) {
744 if (!lst.isEmpty()) {
745 trace->callEdited(this);
746 } else {
747 trace->callReverted(this);
748 }
749 }
750}
751
Zack Rusinf736a622011-08-28 22:19:46 -0400752QVector<QVariant> ApiTraceCall::editedValues() const
Zack Rusina1a3ad52011-08-27 19:19:18 -0400753{
754 return m_editedValues;
755}
756
757bool ApiTraceCall::edited() const
758{
759 return !m_editedValues.isEmpty();
760}
761
762void ApiTraceCall::revert()
763{
Zack Rusinf736a622011-08-28 22:19:46 -0400764 setEditedValues(QVector<QVariant>());
Zack Rusina1a3ad52011-08-27 19:19:18 -0400765}
766
767void ApiTraceCall::setHelpUrl(const QUrl &url)
768{
Zack Rusinac4dd9a2011-08-28 00:38:13 -0400769 m_signature->setHelpUrl(url);
Zack Rusina1a3ad52011-08-27 19:19:18 -0400770}
771
772void ApiTraceCall::setParentFrame(ApiTraceFrame *frame)
773{
774 m_parentFrame = frame;
775}
776
777ApiTraceFrame * ApiTraceCall::parentFrame()const
778{
779 return m_parentFrame;
780}
781
782int ApiTraceCall::index() const
783{
784 return m_index;
785}
786
787QString ApiTraceCall::name() const
788{
Zack Rusinac4dd9a2011-08-28 00:38:13 -0400789 return m_signature->name();
Zack Rusina1a3ad52011-08-27 19:19:18 -0400790}
791
792QStringList ApiTraceCall::argNames() const
793{
Zack Rusinac4dd9a2011-08-28 00:38:13 -0400794 return m_signature->argNames();
Zack Rusina1a3ad52011-08-27 19:19:18 -0400795}
796
Zack Rusinf736a622011-08-28 22:19:46 -0400797QVector<QVariant> ApiTraceCall::arguments() const
Zack Rusina1a3ad52011-08-27 19:19:18 -0400798{
799 if (m_editedValues.isEmpty())
800 return m_argValues;
801 else
802 return m_editedValues;
803}
804
805QVariant ApiTraceCall::returnValue() const
806{
807 return m_returnValue;
808}
809
José Fonseca340f5692011-11-30 07:04:44 +0000810trace::CallFlags ApiTraceCall::flags() const
811{
812 return m_flags;
813}
814
Zack Rusina1a3ad52011-08-27 19:19:18 -0400815QUrl ApiTraceCall::helpUrl() const
816{
Zack Rusinac4dd9a2011-08-28 00:38:13 -0400817 return m_signature->helpUrl();
Zack Rusina1a3ad52011-08-27 19:19:18 -0400818}
819
820bool ApiTraceCall::hasBinaryData() const
821{
822 return m_hasBinaryData;
823}
824
825int ApiTraceCall::binaryDataIndex() const
826{
827 return m_binaryDataIndex;
828}
829
Zack Rusin18eade52011-03-26 14:23:35 -0400830QStaticText ApiTraceCall::staticText() const
831{
Zack Rusin53484b22011-04-16 11:56:19 -0400832 if (m_staticText && !m_staticText->text().isEmpty())
833 return *m_staticText;
Zack Rusin18eade52011-03-26 14:23:35 -0400834
Zack Rusinf736a622011-08-28 22:19:46 -0400835 QVector<QVariant> argValues = arguments();
Zack Rusin9af5bff2011-04-18 01:05:50 -0400836
Zack Rusin53484b22011-04-16 11:56:19 -0400837 QString richText = QString::fromLatin1(
Zack Rusinac4dd9a2011-08-28 00:38:13 -0400838 "<span style=\"font-weight:bold\">%1</span>(").arg(
839 m_signature->name());
840 QStringList argNames = m_signature->argNames();
841 for (int i = 0; i < argNames.count(); ++i) {
Zack Rusin27cb2c42011-03-27 23:53:36 -0400842 richText += QLatin1String("<span style=\"color:#0000ff\">");
Zack Rusin9af5bff2011-04-18 01:05:50 -0400843 QString argText = apiVariantToString(argValues[i]);
Zack Rusindd7f2302011-03-31 22:55:57 -0400844
845 //if arguments are really long (e.g. shader text), cut them
846 // and elide it
847 if (argText.length() > 40) {
848 QString shortened = argText.mid(0, 40);
849 shortened[argText.length() - 5] = '.';
850 shortened[argText.length() - 4] = '.';
851 shortened[argText.length() - 3] = '.';
Zack Rusindf95ce02011-08-27 19:46:16 -0400852 shortened[argText.length() - 2] = argText.at(argText.length() - 2);
853 shortened[argText.length() - 1] = argText.at(argText.length() - 1);
Zack Rusindd7f2302011-03-31 22:55:57 -0400854 richText += shortened;
855 } else {
856 richText += argText;
857 }
Zack Rusin27cb2c42011-03-27 23:53:36 -0400858 richText += QLatin1String("</span>");
Zack Rusinac4dd9a2011-08-28 00:38:13 -0400859 if (i < argNames.count() - 1)
Zack Rusin5e277b02011-04-16 21:52:26 -0400860 richText += QLatin1String(", ");
Zack Rusin27cb2c42011-03-27 23:53:36 -0400861 }
862 richText += QLatin1String(")");
Zack Rusinead6aad2011-04-15 22:16:18 -0400863 if (m_returnValue.isValid()) {
Zack Rusin5e277b02011-04-16 21:52:26 -0400864 richText +=
865 QLatin1Literal(" = ") %
866 QLatin1Literal("<span style=\"color:#0000ff\">") %
867 apiVariantToString(m_returnValue) %
868 QLatin1Literal("</span>");
José Fonseca908f38d2011-03-31 10:09:14 +0100869 }
Zack Rusin27cb2c42011-03-27 23:53:36 -0400870
Zack Rusin53484b22011-04-16 11:56:19 -0400871 if (!m_staticText)
872 m_staticText = new QStaticText(richText);
Zack Rusin9af5bff2011-04-18 01:05:50 -0400873 else
874 m_staticText->setText(richText);
Zack Rusin27cb2c42011-03-27 23:53:36 -0400875 QTextOption opt;
876 opt.setWrapMode(QTextOption::NoWrap);
Zack Rusin53484b22011-04-16 11:56:19 -0400877 m_staticText->setTextOption(opt);
878 m_staticText->prepare();
Zack Rusin27cb2c42011-03-27 23:53:36 -0400879
Zack Rusin53484b22011-04-16 11:56:19 -0400880 return *m_staticText;
Zack Rusin27cb2c42011-03-27 23:53:36 -0400881}
882
883QString ApiTraceCall::toHtml() const
884{
885 if (!m_richText.isEmpty())
886 return m_richText;
887
Zack Rusin5a74d3c2011-11-16 23:52:15 -0500888 m_richText += QLatin1String("<div class=\"call\">");
Zack Rusinb53b1612011-04-19 01:33:58 -0400889
Zack Rusin5a74d3c2011-11-16 23:52:15 -0500890
891 m_richText +=
892 QString::fromLatin1("%1) ")
893 .arg(m_index);
894 QString parentTip;
895 if (m_parentFrame) {
896 parentTip =
897 QString::fromLatin1("Frame %1")
898 .arg(m_parentFrame->number);
899 }
Zack Rusinac4dd9a2011-08-28 00:38:13 -0400900 QUrl helpUrl = m_signature->helpUrl();
901 if (helpUrl.isEmpty()) {
Zack Rusinb53b1612011-04-19 01:33:58 -0400902 m_richText += QString::fromLatin1(
Zack Rusin5a74d3c2011-11-16 23:52:15 -0500903 "<span class=\"callName\" title=\"%1\">%2</span>(")
904 .arg(parentTip)
Zack Rusinac4dd9a2011-08-28 00:38:13 -0400905 .arg(m_signature->name());
Zack Rusinc97fadc2011-04-07 15:16:59 -0400906 } else {
Zack Rusinb53b1612011-04-19 01:33:58 -0400907 m_richText += QString::fromLatin1(
Zack Rusin5a74d3c2011-11-16 23:52:15 -0500908 "<span class=\"callName\" title=\"%1\"><a href=\"%2\">%3</a></span>(")
909 .arg(parentTip)
Zack Rusinac4dd9a2011-08-28 00:38:13 -0400910 .arg(helpUrl.toString())
911 .arg(m_signature->name());
Zack Rusinc97fadc2011-04-07 15:16:59 -0400912 }
913
Zack Rusinf736a622011-08-28 22:19:46 -0400914 QVector<QVariant> argValues = arguments();
Zack Rusinac4dd9a2011-08-28 00:38:13 -0400915 QStringList argNames = m_signature->argNames();
916 for (int i = 0; i < argNames.count(); ++i) {
Zack Rusinb53b1612011-04-19 01:33:58 -0400917 m_richText +=
918 QLatin1String("<span class=\"arg-name\">") +
Zack Rusinac4dd9a2011-08-28 00:38:13 -0400919 argNames[i] +
Zack Rusinb53b1612011-04-19 01:33:58 -0400920 QLatin1String("</span>") +
921 QLatin1Literal(" = ") +
922 QLatin1Literal("<span class=\"arg-value\">") +
José Fonsecae8a1aa92011-04-21 09:13:23 +0100923 apiVariantToString(argValues[i], true) +
Zack Rusinb53b1612011-04-19 01:33:58 -0400924 QLatin1Literal("</span>");
Zack Rusinac4dd9a2011-08-28 00:38:13 -0400925 if (i < argNames.count() - 1)
Zack Rusin5e277b02011-04-16 21:52:26 -0400926 m_richText += QLatin1String(", ");
Zack Rusin18eade52011-03-26 14:23:35 -0400927 }
928 m_richText += QLatin1String(")");
929
Zack Rusinead6aad2011-04-15 22:16:18 -0400930 if (m_returnValue.isValid()) {
Zack Rusin5e277b02011-04-16 21:52:26 -0400931 m_richText +=
932 QLatin1String(" = ") +
933 QLatin1String("<span style=\"color:#0000ff\">") +
José Fonsecae8a1aa92011-04-21 09:13:23 +0100934 apiVariantToString(m_returnValue, true) +
Zack Rusin5e277b02011-04-16 21:52:26 -0400935 QLatin1String("</span>");
Zack Rusin18eade52011-03-26 14:23:35 -0400936 }
Zack Rusinb53b1612011-04-19 01:33:58 -0400937 m_richText += QLatin1String("</div>");
938
Zack Rusincc0b4912011-04-19 01:59:20 -0400939 if (hasError()) {
940 QString errorStr =
941 QString::fromLatin1(
942 "<div class=\"error\">%1</div>")
943 .arg(m_error);
944 m_richText += errorStr;
945 }
946
Zack Rusinb53b1612011-04-19 01:33:58 -0400947 m_richText =
948 QString::fromLatin1(
949 "<html><head><style type=\"text/css\" media=\"all\">"
950 "%1</style></head><body>%2</body></html>")
951 .arg(styleSheet)
952 .arg(m_richText);
Zack Rusin5e277b02011-04-16 21:52:26 -0400953 m_richText.squeeze();
Zack Rusinb53b1612011-04-19 01:33:58 -0400954
955 //qDebug()<<m_richText;
Zack Rusin18eade52011-03-26 14:23:35 -0400956 return m_richText;
957}
Zack Rusinba3c1bf2011-03-27 17:12:06 -0400958
Zack Rusindc792082011-08-27 23:29:19 -0400959QString ApiTraceCall::searchText() const
Zack Rusinba3c1bf2011-03-27 17:12:06 -0400960{
Zack Rusindc792082011-08-27 23:29:19 -0400961 if (!m_searchText.isEmpty())
962 return m_searchText;
Zack Rusinba3c1bf2011-03-27 17:12:06 -0400963
Zack Rusinf736a622011-08-28 22:19:46 -0400964 QVector<QVariant> argValues = arguments();
Zack Rusinac4dd9a2011-08-28 00:38:13 -0400965 m_searchText = m_signature->name() + QLatin1Literal("(");
966 QStringList argNames = m_signature->argNames();
967 for (int i = 0; i < argNames.count(); ++i) {
968 m_searchText += argNames[i] +
Zack Rusin5e277b02011-04-16 21:52:26 -0400969 QLatin1Literal(" = ") +
Zack Rusin9af5bff2011-04-18 01:05:50 -0400970 apiVariantToString(argValues[i]);
Zack Rusinac4dd9a2011-08-28 00:38:13 -0400971 if (i < argNames.count() - 1)
Zack Rusindc792082011-08-27 23:29:19 -0400972 m_searchText += QLatin1String(", ");
Zack Rusinba3c1bf2011-03-27 17:12:06 -0400973 }
Zack Rusindc792082011-08-27 23:29:19 -0400974 m_searchText += QLatin1String(")");
Zack Rusinba3c1bf2011-03-27 17:12:06 -0400975
Zack Rusinead6aad2011-04-15 22:16:18 -0400976 if (m_returnValue.isValid()) {
Zack Rusindc792082011-08-27 23:29:19 -0400977 m_searchText += QLatin1Literal(" = ") +
Zack Rusin5e277b02011-04-16 21:52:26 -0400978 apiVariantToString(m_returnValue);
Zack Rusinba3c1bf2011-03-27 17:12:06 -0400979 }
Zack Rusindc792082011-08-27 23:29:19 -0400980 m_searchText.squeeze();
981 return m_searchText;
Zack Rusinba3c1bf2011-03-27 17:12:06 -0400982}
Zack Rusinf6667d12011-03-30 11:03:37 -0400983
Zack Rusina1a3ad52011-08-27 19:19:18 -0400984int ApiTraceCall::numChildren() const
985{
986 return 0;
987}
988
Zack Rusin8f98c3a2011-09-11 18:21:29 -0400989bool ApiTraceCall::contains(const QString &str,
990 Qt::CaseSensitivity sensitivity) const
991{
992 QString txt = searchText();
993 return txt.contains(str, sensitivity);
994}
995
996
Zack Rusinac4dd9a2011-08-28 00:38:13 -0400997ApiTraceFrame::ApiTraceFrame(ApiTrace *parentTrace)
Zack Rusina1a3ad52011-08-27 19:19:18 -0400998 : ApiTraceEvent(ApiTraceEvent::Frame),
Zack Rusinac4dd9a2011-08-28 00:38:13 -0400999 m_parentTrace(parentTrace),
Zack Rusin20b1f6d2011-09-06 11:50:07 -04001000 m_binaryDataSize(0),
1001 m_loaded(false),
Zack Rusin851d0b02011-09-14 22:04:07 -04001002 m_callsToLoad(0),
1003 m_lastCallIndex(0)
Zack Rusina1a3ad52011-08-27 19:19:18 -04001004{
1005}
1006
Zack Rusinc1743432011-09-13 17:58:58 -04001007ApiTraceFrame::~ApiTraceFrame()
1008{
1009 qDeleteAll(m_calls);
1010}
1011
Zack Rusinf6667d12011-03-30 11:03:37 -04001012QStaticText ApiTraceFrame::staticText() const
1013{
Zack Rusin53484b22011-04-16 11:56:19 -04001014 if (m_staticText && !m_staticText->text().isEmpty())
1015 return *m_staticText;
Zack Rusinf6667d12011-03-30 11:03:37 -04001016
Zack Rusin45e094f2011-09-14 17:36:53 -04001017 QString richText = QObject::tr(
1018 "<span style=\"font-weight:bold\">Frame %1</span>"
1019 "&nbsp;&nbsp;&nbsp;"
1020 "<span style=\"font-style:italic;font-size:small;font-weight:lighter;\"> "
1021 "(%2 calls)</span>")
1022 .arg(number)
1023 .arg(m_loaded ? m_calls.count() : m_callsToLoad);
Zack Rusin9e292fc2011-04-26 23:03:42 -04001024
1025 //mark the frame if it uploads more than a meg a frame
1026 if (m_binaryDataSize > (1024*1024)) {
1027 richText =
1028 QObject::tr(
Zack Rusin45e094f2011-09-14 17:36:53 -04001029 "%1"
Zack Rusin9e292fc2011-04-26 23:03:42 -04001030 "<span style=\"font-style:italic;\">"
1031 "&nbsp;&nbsp;&nbsp;&nbsp;(%2MB)</span>")
Zack Rusin45e094f2011-09-14 17:36:53 -04001032 .arg(richText)
Zack Rusin9e292fc2011-04-26 23:03:42 -04001033 .arg(double(m_binaryDataSize / (1024.*1024.)), 0, 'g', 2);
Zack Rusin9e292fc2011-04-26 23:03:42 -04001034 }
Zack Rusinf6667d12011-03-30 11:03:37 -04001035
Zack Rusin53484b22011-04-16 11:56:19 -04001036 if (!m_staticText)
1037 m_staticText = new QStaticText(richText);
1038
Zack Rusinf6667d12011-03-30 11:03:37 -04001039 QTextOption opt;
1040 opt.setWrapMode(QTextOption::NoWrap);
Zack Rusin53484b22011-04-16 11:56:19 -04001041 m_staticText->setTextOption(opt);
1042 m_staticText->prepare();
Zack Rusinf6667d12011-03-30 11:03:37 -04001043
Zack Rusin53484b22011-04-16 11:56:19 -04001044 return *m_staticText;
Zack Rusinf6667d12011-03-30 11:03:37 -04001045}
1046
Zack Rusinf6667d12011-03-30 11:03:37 -04001047int ApiTraceFrame::numChildren() const
1048{
Zack Rusin3176ebe2011-09-06 21:11:36 -04001049 return m_calls.count();
Zack Rusinf6667d12011-03-30 11:03:37 -04001050}
1051
Zack Rusin7c1793e2011-04-16 23:14:25 -04001052ApiTrace * ApiTraceFrame::parentTrace() const
1053{
1054 return m_parentTrace;
1055}
1056
Zack Rusin1d31b6c2011-04-26 22:30:25 -04001057void ApiTraceFrame::addCall(ApiTraceCall *call)
1058{
1059 m_calls.append(call);
Zack Rusin9e292fc2011-04-26 23:03:42 -04001060 if (call->hasBinaryData()) {
1061 QByteArray data =
1062 call->arguments()[call->binaryDataIndex()].toByteArray();
1063 m_binaryDataSize += data.size();
1064 }
Zack Rusin1d31b6c2011-04-26 22:30:25 -04001065}
1066
Zack Rusin4d0ef5d2011-08-28 22:05:31 -04001067QVector<ApiTraceCall*> ApiTraceFrame::calls() const
Zack Rusin1d31b6c2011-04-26 22:30:25 -04001068{
1069 return m_calls;
1070}
1071
1072ApiTraceCall * ApiTraceFrame::call(int idx) const
1073{
1074 return m_calls.value(idx);
1075}
1076
Zack Rusinda7579b2011-09-13 17:33:05 -04001077
1078ApiTraceCall * ApiTraceFrame::callWithIndex(int index) const
1079{
1080 QVector<ApiTraceCall*>::const_iterator itr;
1081 for (itr = m_calls.constBegin(); itr != m_calls.constEnd(); ++itr) {
1082 if ((*itr)->index() == index) {
1083 return *itr;
1084 }
1085 }
1086 return 0;
1087}
1088
Zack Rusin1d31b6c2011-04-26 22:30:25 -04001089int ApiTraceFrame::callIndex(ApiTraceCall *call) const
1090{
1091 return m_calls.indexOf(call);
1092}
1093
1094bool ApiTraceFrame::isEmpty() const
1095{
Zack Rusin3176ebe2011-09-06 21:11:36 -04001096 if (m_loaded) {
1097 return m_calls.isEmpty();
1098 } else {
1099 return m_callsToLoad == 0;
1100 }
Zack Rusin1d31b6c2011-04-26 22:30:25 -04001101}
1102
Zack Rusin9e292fc2011-04-26 23:03:42 -04001103int ApiTraceFrame::binaryDataSize() const
1104{
1105 return m_binaryDataSize;
1106}
Zack Rusin4d0ef5d2011-08-28 22:05:31 -04001107
1108void ApiTraceFrame::setCalls(const QVector<ApiTraceCall*> &calls,
1109 quint64 binaryDataSize)
1110{
1111 m_calls = calls;
1112 m_binaryDataSize = binaryDataSize;
Zack Rusin20b1f6d2011-09-06 11:50:07 -04001113 m_loaded = true;
Zack Rusin45e094f2011-09-14 17:36:53 -04001114 delete m_staticText;
1115 m_staticText = 0;
Zack Rusin20b1f6d2011-09-06 11:50:07 -04001116}
1117
Zack Rusin1a9f7af2011-09-18 19:40:47 -04001118bool ApiTraceFrame::isLoaded() const
Zack Rusin20b1f6d2011-09-06 11:50:07 -04001119{
1120 return m_loaded;
1121}
1122
1123void ApiTraceFrame::setLoaded(bool l)
1124{
1125 m_loaded = l;
1126}
1127
1128void ApiTraceFrame::setNumChildren(int num)
1129{
1130 m_callsToLoad = num;
Zack Rusin4d0ef5d2011-08-28 22:05:31 -04001131}
Zack Rusinebf971e2011-09-06 17:44:43 -04001132
1133void ApiTraceFrame::setParentTrace(ApiTrace *parent)
1134{
1135 m_parentTrace = parent;
1136}
Zack Rusin3176ebe2011-09-06 21:11:36 -04001137
1138int ApiTraceFrame::numChildrenToLoad() const
1139{
1140 return m_callsToLoad;
1141}
Zack Rusin8f98c3a2011-09-11 18:21:29 -04001142
1143ApiTraceCall *
1144ApiTraceFrame::findNextCall(ApiTraceCall *from,
1145 const QString &str,
1146 Qt::CaseSensitivity sensitivity) const
1147{
1148 Q_ASSERT(m_loaded);
1149
1150 int callIndex = 0;
1151
1152 if (from) {
1153 callIndex = m_calls.indexOf(from) + 1;
1154 }
1155
1156 for (int i = callIndex; i < m_calls.count(); ++i) {
1157 ApiTraceCall *call = m_calls[i];
1158 if (call->contains(str, sensitivity)) {
1159 return call;
1160 }
1161 }
1162 return 0;
1163}
1164
1165ApiTraceCall *
1166ApiTraceFrame::findPrevCall(ApiTraceCall *from,
1167 const QString &str,
1168 Qt::CaseSensitivity sensitivity) const
1169{
1170 Q_ASSERT(m_loaded);
1171
1172 int callIndex = m_calls.count() - 1;
1173
1174 if (from) {
1175 callIndex = m_calls.indexOf(from) - 1;
1176 }
1177
1178 for (int i = callIndex; i >= 0; --i) {
1179 ApiTraceCall *call = m_calls[i];
1180 if (call->contains(str, sensitivity)) {
1181 return call;
1182 }
1183 }
1184 return 0;
1185}
Zack Rusin851d0b02011-09-14 22:04:07 -04001186
1187void ApiTraceFrame::setLastCallIndex(unsigned index)
1188{
1189 m_lastCallIndex = index;
1190}
1191
1192unsigned ApiTraceFrame::lastCallIndex() const
1193{
1194 if (m_loaded && !m_calls.isEmpty()) {
1195 return m_calls.last()->index();
1196 } else {
1197 return m_lastCallIndex;
1198 }
1199}