blob: d353cfdc41133a2c8277b4c81167b88b8ec3233d [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
yangsu@google.coma8a42e22011-06-16 20:49:55 +00008#include "SkDebugDumper.h"
9#include "SkString.h"
10#include "SkPaint.h"
11#include "SkShader.h"
12#include "SkPathEffect.h"
13#include "SkXfermode.h"
14#include "SkColorFilter.h"
15#include "SkPathEffect.h"
16#include "SkMaskFilter.h"
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000017#include "DebuggerViews.h"
yangsu@google.coma8a42e22011-06-16 20:49:55 +000018
19SkDebugDumper::SkDebugDumper(SkEventSinkID cID, SkEventSinkID clID,
20 SkEventSinkID ipID) {
21 fContentID = cID;
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000022 fCommandsID = clID;
23 fStateID = ipID;
yangsu@google.coma8a42e22011-06-16 20:49:55 +000024 fInit = false;
25 fDisabled = false;
26 fCount = 0;
yangsu@google.coma8a42e22011-06-16 20:49:55 +000027}
28
29static void appendPtr(SkString* str, const void* ptr, const char name[]) {
30 if (ptr) {
31 str->appendf("$s: %p\t", name, ptr);
32 }
33}
34
35static void appendFlattenable(SkString* str, const SkFlattenable* ptr,
36 const char name[]) {
37 if (ptr) {
38 SkString info;
39 if (ptr->toDumpString(&info)) {
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000040 str->appendf("%s\n", info.c_str());
yangsu@google.coma8a42e22011-06-16 20:49:55 +000041 } else {
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000042 str->appendf("%s: %p\n", name, ptr);
yangsu@google.coma8a42e22011-06-16 20:49:55 +000043 }
44 }
45}
46
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000047static SkString dumpMatrix(SkDumpCanvas* canvas) {
yangsu@google.coma8a42e22011-06-16 20:49:55 +000048 SkString str;
49 SkMatrix m = canvas->getTotalMatrix();
50 str.appendf("Matrix:");
51 str.appendf("Translate (%0.4g, %0.4g) ",
52 SkScalarToFloat(m.get(SkMatrix::kMTransX)),
53 SkScalarToFloat(m.get(SkMatrix::kMTransY)));
54 str.appendf("Scale (%0.4g, %0.4g) ",
55 SkScalarToFloat(m.get(SkMatrix::kMScaleX)),
56 SkScalarToFloat(m.get(SkMatrix::kMScaleY)));
57 str.appendf("Skew (%0.4g, %0.4g) ",
58 SkScalarToFloat(m.get(SkMatrix::kMSkewX)),
59 SkScalarToFloat(m.get(SkMatrix::kMSkewY)));
60 str.appendf("Perspective (%0.4g, %0.4g, %0.4g) ",
61 SkScalarToFloat(m.get(SkMatrix::kMPersp0)),
62 SkScalarToFloat(m.get(SkMatrix::kMPersp1)),
63 SkScalarToFloat(m.get(SkMatrix::kMPersp2)));
64 return str;
65}
66
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000067static SkString dumpClip(SkDumpCanvas* canvas) {
yangsu@google.coma8a42e22011-06-16 20:49:55 +000068 SkString str;
69 SkPath p;
70 int maxPts = 50;
71 if (canvas->getTotalClip().getBoundaryPath(&p)) {
72 SkPoint pts[maxPts];
73 int numPts = p.getPoints(pts, maxPts);
74
75 str.appendf("Clip: [ ");
76 for (int i = 0; i < numPts; ++i) {
77 str.appendf("(%0.4g, %0.4g)", pts[i].x(), pts[i].y());
78 if (i < numPts-1)
79 str.appendf(" , ");
80 }
81 str.appendf(" ]");
82 }
83 return str;
84}
85
86static const char* gPaintFlags[] = {
87 "AntiAliasing",
88 "Bitmap Filtering",
89 "Dithering",
90 "Underline Text",
91 "Strike-Through Text",
92 "Fake Bold Text",
93 "Linear Text",
94 "Subpixel Positioned Text",
95 "Device Kerning Text",
96 "LCD/Subpixel Glyph Rendering",
97 "Embedded Bitmap Text",
98 "Freetype Autohinting",
yangsu@google.coma8a42e22011-06-16 20:49:55 +000099 "ALL"
100};
101
102
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000103static SkString dumpPaint(SkDumpCanvas* canvas, const SkPaint* p,
104 SkDumpCanvas::Verb verb) {
yangsu@google.coma8a42e22011-06-16 20:49:55 +0000105 SkString str;
106 str.appendf("Color: #%08X\n", p->getColor());
107 str.appendf("Flags: %s\n", gPaintFlags[p->getFlags()]);
108 appendFlattenable(&str, p->getShader(), "shader");
109 appendFlattenable(&str, p->getXfermode(), "xfermode");
110 appendFlattenable(&str, p->getPathEffect(), "pathEffect");
111 appendFlattenable(&str, p->getMaskFilter(), "maskFilter");
112 appendFlattenable(&str, p->getPathEffect(), "pathEffect");
113 appendFlattenable(&str, p->getColorFilter(), "filter");
114
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000115 if (SkDumpCanvas::kDrawText_Verb == verb) {
yangsu@google.coma8a42e22011-06-16 20:49:55 +0000116 str.appendf("Text Size:%0.4g\n", SkScalarToFloat(p->getTextSize()));
117 appendPtr(&str, p->getTypeface(), "typeface");
118 }
119
120 return str;
121}
122
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000123void SkDebugDumper::dump(SkDumpCanvas* canvas, SkDumpCanvas::Verb verb,
yangsu@google.coma8a42e22011-06-16 20:49:55 +0000124 const char str[], const SkPaint* p) {
125 if (!fDisabled) {
126 SkString msg, tab;
127
128 const int level = canvas->getNestLevel() + canvas->getSaveCount() - 1;
129 SkASSERT(level >= 0);
130 for (int i = 0; i < level; i++) {
131 tab.append("| ");
132 }
133
134 msg.appendf("%03d: %s%s\n", fCount, tab.c_str(), str);
135 ++fCount;
136 if (!fInit) {
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000137 SkEvent* cmd = new SkEvent(SKDEBUGGER_COMMANDTYPE, fCommandsID);
138 cmd->setString(SKDEBUGGER_ATOM, msg);
139 cmd->postDelay(100);
yangsu@google.coma8a42e22011-06-16 20:49:55 +0000140 }
141 else {
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000142 SkEvent* state = new SkEvent(SKDEBUGGER_STATETYPE, fStateID);
143 state->setString(SKDEBUGGER_MATRIX, dumpMatrix(canvas));
144 state->setString(SKDEBUGGER_CLIP, dumpClip(canvas));
yangsu@google.coma8a42e22011-06-16 20:49:55 +0000145 if (p) {
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000146 state->setString(SKDEBUGGER_PAINTINFO, dumpPaint(canvas, p, verb));
147 state->getMetaData().setPtr(SKDEBUGGER_PAINT, (void*)p, PaintProc);
yangsu@google.coma8a42e22011-06-16 20:49:55 +0000148 }
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000149 state->post();
yangsu@google.coma8a42e22011-06-16 20:49:55 +0000150 }
151 }
152}