Added Debugger to Sample App, off by default
Removed CocoaDebugger from experimental
Slight changes to SkOSMenu
Bug fixes for NetPipeReader and DrawingBoard
git-svn-id: http://skia.googlecode.com/svn/trunk@2102 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/experimental/Debugger/SkDebugDumper.cpp b/experimental/Debugger/SkDebugDumper.cpp
new file mode 100644
index 0000000..d353cfd
--- /dev/null
+++ b/experimental/Debugger/SkDebugDumper.cpp
@@ -0,0 +1,152 @@
+
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+#include "SkDebugDumper.h"
+#include "SkString.h"
+#include "SkPaint.h"
+#include "SkShader.h"
+#include "SkPathEffect.h"
+#include "SkXfermode.h"
+#include "SkColorFilter.h"
+#include "SkPathEffect.h"
+#include "SkMaskFilter.h"
+#include "DebuggerViews.h"
+
+SkDebugDumper::SkDebugDumper(SkEventSinkID cID, SkEventSinkID clID,
+ SkEventSinkID ipID) {
+ fContentID = cID;
+ fCommandsID = clID;
+ fStateID = ipID;
+ fInit = false;
+ fDisabled = false;
+ fCount = 0;
+}
+
+static void appendPtr(SkString* str, const void* ptr, const char name[]) {
+ if (ptr) {
+ str->appendf("$s: %p\t", name, ptr);
+ }
+}
+
+static void appendFlattenable(SkString* str, const SkFlattenable* ptr,
+ const char name[]) {
+ if (ptr) {
+ SkString info;
+ if (ptr->toDumpString(&info)) {
+ str->appendf("%s\n", info.c_str());
+ } else {
+ str->appendf("%s: %p\n", name, ptr);
+ }
+ }
+}
+
+static SkString dumpMatrix(SkDumpCanvas* canvas) {
+ SkString str;
+ SkMatrix m = canvas->getTotalMatrix();
+ str.appendf("Matrix:");
+ str.appendf("Translate (%0.4g, %0.4g) ",
+ SkScalarToFloat(m.get(SkMatrix::kMTransX)),
+ SkScalarToFloat(m.get(SkMatrix::kMTransY)));
+ str.appendf("Scale (%0.4g, %0.4g) ",
+ SkScalarToFloat(m.get(SkMatrix::kMScaleX)),
+ SkScalarToFloat(m.get(SkMatrix::kMScaleY)));
+ str.appendf("Skew (%0.4g, %0.4g) ",
+ SkScalarToFloat(m.get(SkMatrix::kMSkewX)),
+ SkScalarToFloat(m.get(SkMatrix::kMSkewY)));
+ str.appendf("Perspective (%0.4g, %0.4g, %0.4g) ",
+ SkScalarToFloat(m.get(SkMatrix::kMPersp0)),
+ SkScalarToFloat(m.get(SkMatrix::kMPersp1)),
+ SkScalarToFloat(m.get(SkMatrix::kMPersp2)));
+ return str;
+}
+
+static SkString dumpClip(SkDumpCanvas* canvas) {
+ SkString str;
+ SkPath p;
+ int maxPts = 50;
+ if (canvas->getTotalClip().getBoundaryPath(&p)) {
+ SkPoint pts[maxPts];
+ int numPts = p.getPoints(pts, maxPts);
+
+ str.appendf("Clip: [ ");
+ for (int i = 0; i < numPts; ++i) {
+ str.appendf("(%0.4g, %0.4g)", pts[i].x(), pts[i].y());
+ if (i < numPts-1)
+ str.appendf(" , ");
+ }
+ str.appendf(" ]");
+ }
+ return str;
+}
+
+static const char* gPaintFlags[] = {
+ "AntiAliasing",
+ "Bitmap Filtering",
+ "Dithering",
+ "Underline Text",
+ "Strike-Through Text",
+ "Fake Bold Text",
+ "Linear Text",
+ "Subpixel Positioned Text",
+ "Device Kerning Text",
+ "LCD/Subpixel Glyph Rendering",
+ "Embedded Bitmap Text",
+ "Freetype Autohinting",
+ "ALL"
+};
+
+
+static SkString dumpPaint(SkDumpCanvas* canvas, const SkPaint* p,
+ SkDumpCanvas::Verb verb) {
+ SkString str;
+ str.appendf("Color: #%08X\n", p->getColor());
+ str.appendf("Flags: %s\n", gPaintFlags[p->getFlags()]);
+ appendFlattenable(&str, p->getShader(), "shader");
+ appendFlattenable(&str, p->getXfermode(), "xfermode");
+ appendFlattenable(&str, p->getPathEffect(), "pathEffect");
+ appendFlattenable(&str, p->getMaskFilter(), "maskFilter");
+ appendFlattenable(&str, p->getPathEffect(), "pathEffect");
+ appendFlattenable(&str, p->getColorFilter(), "filter");
+
+ if (SkDumpCanvas::kDrawText_Verb == verb) {
+ str.appendf("Text Size:%0.4g\n", SkScalarToFloat(p->getTextSize()));
+ appendPtr(&str, p->getTypeface(), "typeface");
+ }
+
+ return str;
+}
+
+void SkDebugDumper::dump(SkDumpCanvas* canvas, SkDumpCanvas::Verb verb,
+ const char str[], const SkPaint* p) {
+ if (!fDisabled) {
+ SkString msg, tab;
+
+ const int level = canvas->getNestLevel() + canvas->getSaveCount() - 1;
+ SkASSERT(level >= 0);
+ for (int i = 0; i < level; i++) {
+ tab.append("| ");
+ }
+
+ msg.appendf("%03d: %s%s\n", fCount, tab.c_str(), str);
+ ++fCount;
+ if (!fInit) {
+ SkEvent* cmd = new SkEvent(SKDEBUGGER_COMMANDTYPE, fCommandsID);
+ cmd->setString(SKDEBUGGER_ATOM, msg);
+ cmd->postDelay(100);
+ }
+ else {
+ SkEvent* state = new SkEvent(SKDEBUGGER_STATETYPE, fStateID);
+ state->setString(SKDEBUGGER_MATRIX, dumpMatrix(canvas));
+ state->setString(SKDEBUGGER_CLIP, dumpClip(canvas));
+ if (p) {
+ state->setString(SKDEBUGGER_PAINTINFO, dumpPaint(canvas, p, verb));
+ state->getMetaData().setPtr(SKDEBUGGER_PAINT, (void*)p, PaintProc);
+ }
+ state->post();
+ }
+ }
+}
\ No newline at end of file