blob: 69b1896626a1dcb8a73cb65f80f237f0aab6f34d [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) {
senorblanco@chromium.org3a67a662012-07-09 18:22:08 +000031 str->appendf("%s: %p\t", name, ptr);
yangsu@google.coma8a42e22011-06-16 20:49:55 +000032 }
33}
34
35static void appendFlattenable(SkString* str, const SkFlattenable* ptr,
36 const char name[]) {
37 if (ptr) {
djsollen@google.coma2ca41e2012-03-23 19:00:34 +000038 str->appendf("%s: %p\n", name, ptr);
yangsu@google.coma8a42e22011-06-16 20:49:55 +000039 }
40}
41
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000042static SkString dumpMatrix(SkDumpCanvas* canvas) {
yangsu@google.coma8a42e22011-06-16 20:49:55 +000043 SkString str;
44 SkMatrix m = canvas->getTotalMatrix();
vandebo@chromium.orgb9682d32012-02-21 18:53:39 +000045 str.append("Matrix:");
yangsu@google.coma8a42e22011-06-16 20:49:55 +000046 str.appendf("Translate (%0.4g, %0.4g) ",
47 SkScalarToFloat(m.get(SkMatrix::kMTransX)),
48 SkScalarToFloat(m.get(SkMatrix::kMTransY)));
49 str.appendf("Scale (%0.4g, %0.4g) ",
50 SkScalarToFloat(m.get(SkMatrix::kMScaleX)),
51 SkScalarToFloat(m.get(SkMatrix::kMScaleY)));
52 str.appendf("Skew (%0.4g, %0.4g) ",
53 SkScalarToFloat(m.get(SkMatrix::kMSkewX)),
54 SkScalarToFloat(m.get(SkMatrix::kMSkewY)));
55 str.appendf("Perspective (%0.4g, %0.4g, %0.4g) ",
bungeman@google.com07faed12011-10-07 21:55:56 +000056 SkScalarToFloat(SkPerspToScalar(m.get(SkMatrix::kMPersp0))),
57 SkScalarToFloat(SkPerspToScalar(m.get(SkMatrix::kMPersp1))),
58 SkScalarToFloat(SkPerspToScalar(m.get(SkMatrix::kMPersp2))));
yangsu@google.coma8a42e22011-06-16 20:49:55 +000059 return str;
60}
61
yangsu@google.com9b77fbd2011-08-12 15:18:25 +000062
63static const int maxPts = 50;
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000064static SkString dumpClip(SkDumpCanvas* canvas) {
yangsu@google.coma8a42e22011-06-16 20:49:55 +000065 SkString str;
66 SkPath p;
yangsu@google.coma8a42e22011-06-16 20:49:55 +000067 if (canvas->getTotalClip().getBoundaryPath(&p)) {
68 SkPoint pts[maxPts];
69 int numPts = p.getPoints(pts, maxPts);
70
vandebo@chromium.orgb9682d32012-02-21 18:53:39 +000071 str.append("Clip: [ ");
yangsu@google.coma8a42e22011-06-16 20:49:55 +000072 for (int i = 0; i < numPts; ++i) {
73 str.appendf("(%0.4g, %0.4g)", pts[i].x(), pts[i].y());
74 if (i < numPts-1)
vandebo@chromium.orgb9682d32012-02-21 18:53:39 +000075 str.append(" , ");
yangsu@google.coma8a42e22011-06-16 20:49:55 +000076 }
vandebo@chromium.orgb9682d32012-02-21 18:53:39 +000077 str.append(" ]");
yangsu@google.coma8a42e22011-06-16 20:49:55 +000078 }
79 return str;
80}
81
82static const char* gPaintFlags[] = {
83 "AntiAliasing",
84 "Bitmap Filtering",
85 "Dithering",
86 "Underline Text",
87 "Strike-Through Text",
88 "Fake Bold Text",
89 "Linear Text",
90 "Subpixel Positioned Text",
91 "Device Kerning Text",
92 "LCD/Subpixel Glyph Rendering",
93 "Embedded Bitmap Text",
94 "Freetype Autohinting",
yangsu@google.coma8a42e22011-06-16 20:49:55 +000095 "ALL"
96};
97
98
yangsu@google.comef7bdfa2011-08-12 14:27:47 +000099static SkString dumpPaint(SkDumpCanvas* canvas, const SkPaint* p,
100 SkDumpCanvas::Verb verb) {
yangsu@google.coma8a42e22011-06-16 20:49:55 +0000101 SkString str;
102 str.appendf("Color: #%08X\n", p->getColor());
103 str.appendf("Flags: %s\n", gPaintFlags[p->getFlags()]);
104 appendFlattenable(&str, p->getShader(), "shader");
105 appendFlattenable(&str, p->getXfermode(), "xfermode");
106 appendFlattenable(&str, p->getPathEffect(), "pathEffect");
107 appendFlattenable(&str, p->getMaskFilter(), "maskFilter");
108 appendFlattenable(&str, p->getPathEffect(), "pathEffect");
109 appendFlattenable(&str, p->getColorFilter(), "filter");
110
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000111 if (SkDumpCanvas::kDrawText_Verb == verb) {
yangsu@google.coma8a42e22011-06-16 20:49:55 +0000112 str.appendf("Text Size:%0.4g\n", SkScalarToFloat(p->getTextSize()));
113 appendPtr(&str, p->getTypeface(), "typeface");
114 }
115
116 return str;
117}
118
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000119void SkDebugDumper::dump(SkDumpCanvas* canvas, SkDumpCanvas::Verb verb,
yangsu@google.coma8a42e22011-06-16 20:49:55 +0000120 const char str[], const SkPaint* p) {
121 if (!fDisabled) {
122 SkString msg, tab;
123
124 const int level = canvas->getNestLevel() + canvas->getSaveCount() - 1;
125 SkASSERT(level >= 0);
126 for (int i = 0; i < level; i++) {
127 tab.append("| ");
128 }
129
130 msg.appendf("%03d: %s%s\n", fCount, tab.c_str(), str);
131 ++fCount;
132 if (!fInit) {
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000133 SkEvent* cmd = new SkEvent(SKDEBUGGER_COMMANDTYPE, fCommandsID);
134 cmd->setString(SKDEBUGGER_ATOM, msg);
135 cmd->postDelay(100);
yangsu@google.coma8a42e22011-06-16 20:49:55 +0000136 }
137 else {
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000138 SkEvent* state = new SkEvent(SKDEBUGGER_STATETYPE, fStateID);
139 state->setString(SKDEBUGGER_MATRIX, dumpMatrix(canvas));
140 state->setString(SKDEBUGGER_CLIP, dumpClip(canvas));
yangsu@google.coma8a42e22011-06-16 20:49:55 +0000141 if (p) {
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000142 state->setString(SKDEBUGGER_PAINTINFO, dumpPaint(canvas, p, verb));
143 state->getMetaData().setPtr(SKDEBUGGER_PAINT, (void*)p, PaintProc);
yangsu@google.coma8a42e22011-06-16 20:49:55 +0000144 }
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000145 state->post();
yangsu@google.coma8a42e22011-06-16 20:49:55 +0000146 }
147 }
bungeman@google.com07faed12011-10-07 21:55:56 +0000148}