blob: 2f63462dc3f2d142e7c400384990ae0684fa7dff [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.com9b77fbd2011-08-12 15:18:25 +000067
68static const int maxPts = 50;
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000069static SkString dumpClip(SkDumpCanvas* canvas) {
yangsu@google.coma8a42e22011-06-16 20:49:55 +000070 SkString str;
71 SkPath p;
yangsu@google.coma8a42e22011-06-16 20:49:55 +000072 if (canvas->getTotalClip().getBoundaryPath(&p)) {
73 SkPoint pts[maxPts];
74 int numPts = p.getPoints(pts, maxPts);
75
76 str.appendf("Clip: [ ");
77 for (int i = 0; i < numPts; ++i) {
78 str.appendf("(%0.4g, %0.4g)", pts[i].x(), pts[i].y());
79 if (i < numPts-1)
80 str.appendf(" , ");
81 }
82 str.appendf(" ]");
83 }
84 return str;
85}
86
87static const char* gPaintFlags[] = {
88 "AntiAliasing",
89 "Bitmap Filtering",
90 "Dithering",
91 "Underline Text",
92 "Strike-Through Text",
93 "Fake Bold Text",
94 "Linear Text",
95 "Subpixel Positioned Text",
96 "Device Kerning Text",
97 "LCD/Subpixel Glyph Rendering",
98 "Embedded Bitmap Text",
99 "Freetype Autohinting",
yangsu@google.coma8a42e22011-06-16 20:49:55 +0000100 "ALL"
101};
102
103
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000104static SkString dumpPaint(SkDumpCanvas* canvas, const SkPaint* p,
105 SkDumpCanvas::Verb verb) {
yangsu@google.coma8a42e22011-06-16 20:49:55 +0000106 SkString str;
107 str.appendf("Color: #%08X\n", p->getColor());
108 str.appendf("Flags: %s\n", gPaintFlags[p->getFlags()]);
109 appendFlattenable(&str, p->getShader(), "shader");
110 appendFlattenable(&str, p->getXfermode(), "xfermode");
111 appendFlattenable(&str, p->getPathEffect(), "pathEffect");
112 appendFlattenable(&str, p->getMaskFilter(), "maskFilter");
113 appendFlattenable(&str, p->getPathEffect(), "pathEffect");
114 appendFlattenable(&str, p->getColorFilter(), "filter");
115
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000116 if (SkDumpCanvas::kDrawText_Verb == verb) {
yangsu@google.coma8a42e22011-06-16 20:49:55 +0000117 str.appendf("Text Size:%0.4g\n", SkScalarToFloat(p->getTextSize()));
118 appendPtr(&str, p->getTypeface(), "typeface");
119 }
120
121 return str;
122}
123
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000124void SkDebugDumper::dump(SkDumpCanvas* canvas, SkDumpCanvas::Verb verb,
yangsu@google.coma8a42e22011-06-16 20:49:55 +0000125 const char str[], const SkPaint* p) {
126 if (!fDisabled) {
127 SkString msg, tab;
128
129 const int level = canvas->getNestLevel() + canvas->getSaveCount() - 1;
130 SkASSERT(level >= 0);
131 for (int i = 0; i < level; i++) {
132 tab.append("| ");
133 }
134
135 msg.appendf("%03d: %s%s\n", fCount, tab.c_str(), str);
136 ++fCount;
137 if (!fInit) {
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000138 SkEvent* cmd = new SkEvent(SKDEBUGGER_COMMANDTYPE, fCommandsID);
139 cmd->setString(SKDEBUGGER_ATOM, msg);
140 cmd->postDelay(100);
yangsu@google.coma8a42e22011-06-16 20:49:55 +0000141 }
142 else {
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000143 SkEvent* state = new SkEvent(SKDEBUGGER_STATETYPE, fStateID);
144 state->setString(SKDEBUGGER_MATRIX, dumpMatrix(canvas));
145 state->setString(SKDEBUGGER_CLIP, dumpClip(canvas));
yangsu@google.coma8a42e22011-06-16 20:49:55 +0000146 if (p) {
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000147 state->setString(SKDEBUGGER_PAINTINFO, dumpPaint(canvas, p, verb));
148 state->getMetaData().setPtr(SKDEBUGGER_PAINT, (void*)p, PaintProc);
yangsu@google.coma8a42e22011-06-16 20:49:55 +0000149 }
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000150 state->post();
yangsu@google.coma8a42e22011-06-16 20:49:55 +0000151 }
152 }
153}