1 #include "apitracecall.h"
3 #include "trace_model.hpp"
7 ApiPointer::ApiPointer(int val)
12 QString ApiPointer::toString() const
15 return QString("0x%1").arg(m_value, 0, 16);
17 return QLatin1String("NULL");
20 QString apiVariantToString(const QVariant &variant)
22 if (variant.userType() == QVariant::Double) {
23 return QString::number(variant.toFloat());
26 if (variant.userType() < QVariant::UserType) {
27 return variant.toString();
30 if (variant.canConvert<ApiPointer>()) {
31 return variant.value<ApiPointer>().toString();
33 if (variant.canConvert<ApiBitmask>()) {
34 return variant.value<ApiBitmask>().toString();
36 if (variant.canConvert<ApiStruct>()) {
37 return variant.value<ApiStruct>().toString();
39 if (variant.canConvert<ApiArray>()) {
40 return variant.value<ApiArray>().toString();
46 ApiBitmask::ApiBitmask(const Trace::Bitmask *bitmask)
53 void ApiBitmask::init(const Trace::Bitmask *bitmask)
58 m_value = bitmask->value;
59 for (Trace::Bitmask::Signature::const_iterator it = bitmask->sig->begin();
60 it != bitmask->sig->end(); ++it) {
62 QPair<QString, unsigned long long> pair;
64 pair.first = QString::fromStdString(it->first);
65 pair.second = it->second;
71 QString ApiBitmask::toString() const
74 unsigned long long value = m_value;
76 for (Signature::const_iterator it = m_sig.begin();
77 value != 0 && it != m_sig.end(); ++it) {
79 if ((value & it->second) == it->second) {
81 str += QLatin1String(" | ");
90 str += QLatin1String(" | ");
92 str += QString::fromLatin1("0x%1").arg(value, 0, 16);
97 ApiStruct::ApiStruct(const Trace::Struct *s)
102 QString ApiStruct::toString() const
106 str += QLatin1String("{");
107 for (unsigned i = 0; i < m_members.count(); ++i) {
108 str += m_sig.memberNames[i];
109 str += QLatin1String(" = ");
110 str += apiVariantToString(m_members[i]);
111 if (i < m_members.count() - 1)
112 str += QLatin1String(", ");
114 str += QLatin1String("}");
119 void ApiStruct::init(const Trace::Struct *s)
124 m_sig.name = QString::fromStdString(s->sig->name);
125 for (unsigned i = 0; i < s->members.size(); ++i) {
127 m_sig.memberNames.append(
128 QString::fromStdString(s->sig->member_names[i]));
129 s->members[i]->visit(vis);
130 m_members.append(vis.variant());
134 void VariantVisitor::visit(Trace::Null *)
136 m_variant = QVariant(QLatin1String("NULL"));
139 void VariantVisitor::visit(Trace::Bool *node)
141 m_variant = QVariant(node->value);
144 void VariantVisitor::visit(Trace::SInt *node)
146 m_variant = QVariant(node->value);
149 void VariantVisitor::visit(Trace::UInt *node)
151 m_variant = QVariant(node->value);
154 void VariantVisitor::visit(Trace::Float *node)
156 m_variant = QVariant(node->value);
159 void VariantVisitor::visit(Trace::String *node)
161 m_variant = QVariant(QString::fromStdString(node->value));
164 void VariantVisitor::visit(Trace::Enum *e)
166 m_variant = QVariant(QString::fromStdString(e->sig->first));
169 void VariantVisitor::visit(Trace::Bitmask *bitmask)
171 m_variant = QVariant::fromValue(ApiBitmask(bitmask));
174 void VariantVisitor::visit(Trace::Struct *str)
176 m_variant = QVariant::fromValue(ApiStruct(str));
179 void VariantVisitor::visit(Trace::Array *array)
181 m_variant = QVariant::fromValue(ApiArray(array));
184 void VariantVisitor::visit(Trace::Blob *blob)
186 QByteArray barray = QByteArray::fromRawData(blob->buf, blob->size);
187 m_variant = QVariant(barray);
190 void VariantVisitor::visit(Trace::Pointer *ptr)
192 m_variant = QVariant::fromValue(ApiPointer(ptr->value));
195 ApiArray::ApiArray(const Trace::Array *arr)
200 QString ApiArray::toString() const
203 str += QLatin1String("[");
204 for(int i = 0; i < m_array.count(); ++i) {
205 const QVariant &var = m_array[i];
206 str += apiVariantToString(var);
207 if (i < m_array.count() - 1)
208 str += QLatin1String(", ");
210 str += QLatin1String("]");
215 void ApiArray::init(const Trace::Array *arr)
220 for (int i = 0; i < arr->values.size(); ++i) {
222 arr->values[i]->visit(vis);
224 m_array.append(vis.variant());
228 QStaticText ApiTraceCall::staticText() const
230 if (!m_staticText.text().isEmpty())
233 QString richText = QString::fromLatin1("<span style=\"font-weight:bold\">%1</span>(").arg(name);
234 for (int i = 0; i < argNames.count(); ++i) {
235 richText += QLatin1String("<span style=\"color:#0000ff\">");
236 QString argText = apiVariantToString(argValues[i]);
238 //if arguments are really long (e.g. shader text), cut them
240 if (argText.length() > 40) {
241 QString shortened = argText.mid(0, 40);
242 shortened[argText.length() - 5] = '.';
243 shortened[argText.length() - 4] = '.';
244 shortened[argText.length() - 3] = '.';
245 shortened[argText.length() - 2] = argText[argText.length() - 2];
246 shortened[argText.length() - 1] = argText[argText.length() - 1];
247 richText += shortened;
251 richText += QLatin1String("</span>");
252 if (i < argNames.count() - 1)
253 richText += QString::fromLatin1(", ");
255 richText += QLatin1String(")");
256 if (returnValue.isValid()) {
257 richText += QLatin1String(" = ");
258 richText += QLatin1String("<span style=\"color:#0000ff\">");
259 richText += apiVariantToString(returnValue);
260 richText += QLatin1String("</span>");
263 m_staticText.setText(richText);
265 opt.setWrapMode(QTextOption::NoWrap);
266 m_staticText.setTextOption(opt);
267 m_staticText.prepare();
272 QString ApiTraceCall::toHtml() const
274 if (!m_richText.isEmpty())
277 m_richText = QString::fromLatin1("<span style=\"font-weight:bold\">%1</span>(").arg(name);
278 for (int i = 0; i < argNames.count(); ++i) {
279 m_richText += argNames[i];
280 m_richText += QString::fromLatin1(" = ");
281 m_richText += QLatin1String("<span style=\"color:#0000ff\">");
282 m_richText += apiVariantToString(argValues[i]);
283 m_richText += QLatin1String("</span>");
284 if (i < argNames.count() - 1)
285 m_richText += QString::fromLatin1(", ");
287 m_richText += QLatin1String(")");
289 if (returnValue.isValid()) {
290 m_richText += QLatin1String(" = ");
291 m_richText += QLatin1String("<span style=\"color:#0000ff\">");
292 m_richText += apiVariantToString(returnValue);
293 m_richText += QLatin1String("</span>");
298 QString ApiTraceCall::filterText() const
300 if (!m_filterText.isEmpty())
304 for (int i = 0; i < argNames.count(); ++i) {
305 m_filterText += argNames[i];
306 m_filterText += QString::fromLatin1(" = ");
307 m_filterText += apiVariantToString(argValues[i]);
308 if (i < argNames.count() - 1)
309 m_filterText += QString::fromLatin1(", ");
311 m_filterText += QLatin1String(")");
313 if (returnValue.isValid()) {
314 m_filterText += QLatin1String(" = ");
315 m_filterText += apiVariantToString(returnValue);
320 QStaticText ApiTraceFrame::staticText() const
322 if (!m_staticText.text().isEmpty())
326 QString::fromLatin1("<span style=\"font-weight:bold\">Frame %1</span>").arg(number);
328 m_staticText.setText(richText);
330 opt.setWrapMode(QTextOption::NoWrap);
331 m_staticText.setTextOption(opt);
332 m_staticText.prepare();
337 int ApiTraceCall::numChildren() const
342 int ApiTraceFrame::numChildren() const
344 return calls.count();
347 ApiTraceFrame::ApiTraceFrame()
348 : ApiTraceEvent(ApiTraceEvent::Frame)
352 ApiTraceCall::ApiTraceCall()
353 : ApiTraceEvent(ApiTraceEvent::Call)
357 ApiTraceEvent::ApiTraceEvent()
358 : m_type(ApiTraceEvent::None)
362 ApiTraceEvent::ApiTraceEvent(Type t)
367 ApiTraceCall::~ApiTraceCall()