blob: 2afcd188ff34fb833f8bdc2a6556d0e833879e5c [file] [log] [blame]
yangsu@google.coma8a42e22011-06-16 20:49:55 +00001#include "SkDebugDumper.h"
2#include "SkString.h"
3#include "SkPaint.h"
4#include "SkShader.h"
5#include "SkPathEffect.h"
6#include "SkXfermode.h"
7#include "SkColorFilter.h"
8#include "SkPathEffect.h"
9#include "SkMaskFilter.h"
10#include "SkGradientShader.h"
11#include "SkDebuggerViews.h"
12
13bool gNeverSetToTrueJustNeedToFoolLinker;
14static void init_effects() {
15 if (gNeverSetToTrueJustNeedToFoolLinker) {
16 SkPoint p = SkPoint::Make(0,0);
17 SkPoint q = SkPoint::Make(100,100);
18 SkPoint pts[] = {p, q};
19 SkColor colors[] = { SK_ColorRED, SK_ColorGREEN };
20 SkScalar pos[] = { 0, 1.0};
21 SkGradientShader::CreateLinear(pts, colors, pos, 2,
22 SkShader::kMirror_TileMode);
23 }
24}
25
26SkDebugDumper::SkDebugDumper(SkEventSinkID cID, SkEventSinkID clID,
27 SkEventSinkID ipID) {
28 fContentID = cID;
29 fCommandListID = clID;
30 fInfoPanelID = ipID;
31 fInit = false;
32 fDisabled = false;
33 fCount = 0;
34 init_effects();
35}
36
37static void appendPtr(SkString* str, const void* ptr, const char name[]) {
38 if (ptr) {
39 str->appendf("$s: %p\t", name, ptr);
40 }
41}
42
43static void appendFlattenable(SkString* str, const SkFlattenable* ptr,
44 const char name[]) {
45 if (ptr) {
46 SkString info;
47 if (ptr->toDumpString(&info)) {
48 str->appendf("%s", info.c_str());
49 } else {
50 str->appendf("%s: %p", name, ptr);
51 }
52 }
53}
54
55static SkString dumpMatrix(SkDumpCanvasM* canvas) {
56 SkString str;
57 SkMatrix m = canvas->getTotalMatrix();
58 str.appendf("Matrix:");
59 str.appendf("Translate (%0.4g, %0.4g) ",
60 SkScalarToFloat(m.get(SkMatrix::kMTransX)),
61 SkScalarToFloat(m.get(SkMatrix::kMTransY)));
62 str.appendf("Scale (%0.4g, %0.4g) ",
63 SkScalarToFloat(m.get(SkMatrix::kMScaleX)),
64 SkScalarToFloat(m.get(SkMatrix::kMScaleY)));
65 str.appendf("Skew (%0.4g, %0.4g) ",
66 SkScalarToFloat(m.get(SkMatrix::kMSkewX)),
67 SkScalarToFloat(m.get(SkMatrix::kMSkewY)));
68 str.appendf("Perspective (%0.4g, %0.4g, %0.4g) ",
69 SkScalarToFloat(m.get(SkMatrix::kMPersp0)),
70 SkScalarToFloat(m.get(SkMatrix::kMPersp1)),
71 SkScalarToFloat(m.get(SkMatrix::kMPersp2)));
72 return str;
73}
74
75static SkString dumpClip(SkDumpCanvasM* canvas) {
76 SkString str;
77 SkPath p;
78 int maxPts = 50;
79 if (canvas->getTotalClip().getBoundaryPath(&p)) {
80 SkPoint pts[maxPts];
81 int numPts = p.getPoints(pts, maxPts);
82
83 str.appendf("Clip: [ ");
84 for (int i = 0; i < numPts; ++i) {
85 str.appendf("(%0.4g, %0.4g)", pts[i].x(), pts[i].y());
86 if (i < numPts-1)
87 str.appendf(" , ");
88 }
89 str.appendf(" ]");
90 }
91 return str;
92}
93
94static const char* gPaintFlags[] = {
95 "AntiAliasing",
96 "Bitmap Filtering",
97 "Dithering",
98 "Underline Text",
99 "Strike-Through Text",
100 "Fake Bold Text",
101 "Linear Text",
102 "Subpixel Positioned Text",
103 "Device Kerning Text",
104 "LCD/Subpixel Glyph Rendering",
105 "Embedded Bitmap Text",
106 "Freetype Autohinting",
107
108 "ALL"
109};
110
111
112static SkString dumpPaint(SkDumpCanvasM* canvas, const SkPaint* p,
113 SkDumpCanvasM::Verb verb) {
114 SkString str;
115 str.appendf("Color: #%08X\n", p->getColor());
116 str.appendf("Flags: %s\n", gPaintFlags[p->getFlags()]);
117 appendFlattenable(&str, p->getShader(), "shader");
118 appendFlattenable(&str, p->getXfermode(), "xfermode");
119 appendFlattenable(&str, p->getPathEffect(), "pathEffect");
120 appendFlattenable(&str, p->getMaskFilter(), "maskFilter");
121 appendFlattenable(&str, p->getPathEffect(), "pathEffect");
122 appendFlattenable(&str, p->getColorFilter(), "filter");
123
124 if (SkDumpCanvasM::kDrawText_Verb == verb) {
125 str.appendf("Text Size:%0.4g\n", SkScalarToFloat(p->getTextSize()));
126 appendPtr(&str, p->getTypeface(), "typeface");
127 }
128
129 return str;
130}
131
132void SkDebugDumper::dump(SkDumpCanvasM* canvas, SkDumpCanvasM::Verb verb,
133 const char str[], const SkPaint* p) {
134 if (!fDisabled) {
135 SkString msg, tab;
136
137 const int level = canvas->getNestLevel() + canvas->getSaveCount() - 1;
138 SkASSERT(level >= 0);
139 for (int i = 0; i < level; i++) {
140 tab.append("| ");
141 }
142
143 msg.appendf("%03d: %s%s\n", fCount, tab.c_str(), str);
144 ++fCount;
145 if (!fInit) {
146 SkEvent* cmd = new SkEvent(SkDebugger_CommandType);
147 cmd->setString(SkDebugger_Atom, msg);
148 cmd->post(fCommandListID, 100);
149 }
150 else {
151 SkEvent* state = new SkEvent(SkDebugger_StateType);
152 state->setString(SkDebugger_Matrix, dumpMatrix(canvas));
153 state->setString(SkDebugger_Clip, dumpClip(canvas));
154 if (p) {
155 state->setString(SkDebugger_PaintInfo, dumpPaint(canvas, p, verb));
156 state->getMetaData().setPtr(SkDebugger_Paint, (void*)p, PaintProc);
157 }
158 state->post(fInfoPanelID);
159 }
160 }
161}