180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc.
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
8d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkDumpCanvas.h"
10d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger
11d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger#ifdef SK_DEVELOPER
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPicture.h"
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPixelRef.h"
14363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#include "SkRRect.h"
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkString.h"
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include <stdarg.h>
170a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger#include <stdio.h>
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// needed just to know that these are all subclassed from SkFlattenable
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkShader.h"
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPathEffect.h"
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkXfermode.h"
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkColorFilter.h"
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPathEffect.h"
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkMaskFilter.h"
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void toString(const SkRect& r, SkString* str) {
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    str->appendf("[%g,%g %g:%g]",
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                 SkScalarToFloat(r.fLeft), SkScalarToFloat(r.fTop),
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                 SkScalarToFloat(r.width()), SkScalarToFloat(r.height()));
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void toString(const SkIRect& r, SkString* str) {
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    str->appendf("[%d,%d %d:%d]", r.fLeft, r.fTop, r.width(), r.height());
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
37363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstatic void toString(const SkRRect& rrect, SkString* str) {
38363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    SkRect r = rrect.getBounds();
39363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    str->appendf("[%g,%g %g:%g]",
40363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                 SkScalarToFloat(r.fLeft), SkScalarToFloat(r.fTop),
41363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                 SkScalarToFloat(r.width()), SkScalarToFloat(r.height()));
42363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    if (rrect.isOval()) {
43363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        str->append("()");
44363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    } else if (rrect.isSimple()) {
45363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        const SkVector& rad = rrect.getSimpleRadii();
46363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        str->appendf("(%g,%g)", rad.x(), rad.y());
47363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    } else if (rrect.isComplex()) {
48363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        SkVector radii[4] = {
49363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger            rrect.radii(SkRRect::kUpperLeft_Corner),
50363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger            rrect.radii(SkRRect::kUpperRight_Corner),
51363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger            rrect.radii(SkRRect::kLowerRight_Corner),
52363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger            rrect.radii(SkRRect::kLowerLeft_Corner),
53363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        };
54363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger        str->appendf("(%g,%g %g,%g %g,%g %g,%g)",
55363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                     radii[0].x(), radii[0].y(),
56363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                     radii[1].x(), radii[1].y(),
57363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                     radii[2].x(), radii[2].y(),
58363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                     radii[3].x(), radii[3].y());
59363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    }
60363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}
61363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void dumpVerbs(const SkPath& path, SkString* str) {
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkPath::Iter iter(path, false);
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkPoint pts[4];
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    for (;;) {
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        switch (iter.next(pts, false)) {
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            case SkPath::kMove_Verb:
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                str->appendf(" M%g,%g", pts[0].fX, pts[0].fY);
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                break;
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            case SkPath::kLine_Verb:
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                str->appendf(" L%g,%g", pts[0].fX, pts[0].fY);
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                break;
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            case SkPath::kQuad_Verb:
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                str->appendf(" Q%g,%g,%g,%g", pts[1].fX, pts[1].fY,
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                             pts[2].fX, pts[2].fY);
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                break;
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            case SkPath::kCubic_Verb:
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                str->appendf(" C%g,%g,%g,%g,%g,%g", pts[1].fX, pts[1].fY,
7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                             pts[2].fX, pts[2].fY, pts[3].fX, pts[3].fY);
8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                break;
8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            case SkPath::kClose_Verb:
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                str->append("X");
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                break;
8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            case SkPath::kDone_Verb:
8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                return;
8658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            case SkPath::kConic_Verb:
8758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                SkASSERT(0);
8858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                break;
8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void toString(const SkPath& path, SkString* str) {
9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (path.isEmpty()) {
9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        str->append("path:empty");
9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    } else {
9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        toString(path.getBounds(), str);
9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if 1
9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkString s;
10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        dumpVerbs(path, &s);
10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        str->append(s.c_str());
10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        str->append("]");
10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        str->prepend("path:[");
10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char* toString(SkRegion::Op op) {
10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    static const char* gOpNames[] = {
11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        "DIFF", "SECT", "UNION", "XOR", "RDIFF", "REPLACE"
11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    };
11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return gOpNames[op];
11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void toString(const SkRegion& rgn, SkString* str) {
11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    str->append("Region:[");
11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    toString(rgn.getBounds(), str);
11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    str->append("]");
11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (rgn.isComplex()) {
12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        str->append(".complex");
12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char* toString(SkCanvas::VertexMode vm) {
12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    static const char* gVMNames[] = {
12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        "TRIANGLES", "STRIP", "FAN"
12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    };
12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return gVMNames[vm];
12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char* toString(SkCanvas::PointMode pm) {
13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    static const char* gPMNames[] = {
13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        "POINTS", "LINES", "POLYGON"
13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    };
13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return gPMNames[pm];
13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void toString(const void* text, size_t byteLen, SkPaint::TextEncoding enc,
13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                     SkString* str) {
14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // FIXME: this code appears to be untested - and probably unused - and probably wrong
14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    switch (enc) {
14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case SkPaint::kUTF8_TextEncoding:
1430a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            str->appendf("\"%.*s\"%s", (int)SkTMax<size_t>(byteLen, 32), (const char*) text,
14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                        byteLen > 32 ? "..." : "");
14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case SkPaint::kUTF16_TextEncoding:
1470a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            str->appendf("\"%.*ls\"%s", (int)SkTMax<size_t>(byteLen, 32), (const wchar_t*) text,
14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                        byteLen > 64 ? "..." : "");
14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case SkPaint::kUTF32_TextEncoding:
1510a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger            str->appendf("\"%.*ls\"%s", (int)SkTMax<size_t>(byteLen, 32), (const wchar_t*) text,
15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                        byteLen > 128 ? "..." : "");
15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        case SkPaint::kGlyphID_TextEncoding:
15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            str->append("<glyphs>");
15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        default:
15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            SkASSERT(false);
16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            break;
16180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
16280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
16380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
16480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru///////////////////////////////////////////////////////////////////////////////
16580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
16680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic SkBitmap make_wideopen_bm() {
16780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    static const int WIDE_OPEN = 16384;
16880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
16980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkBitmap bm;
17080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bm.setConfig(SkBitmap::kNo_Config, WIDE_OPEN, WIDE_OPEN);
17180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return bm;
17280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
17380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
17480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkDumpCanvas::SkDumpCanvas(Dumper* dumper) : INHERITED(make_wideopen_bm()) {
17580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fNestLevel = 0;
17680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkSafeRef(dumper);
17780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fDumper = dumper;
17880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
17980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
18080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkDumpCanvas::~SkDumpCanvas() {
18180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkSafeUnref(fDumper);
18280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
18380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
18480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDumpCanvas::dump(Verb verb, const SkPaint* paint,
18580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                        const char format[], ...) {
18680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    static const size_t BUFFER_SIZE = 1024;
18780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
18880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    char    buffer[BUFFER_SIZE];
18980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    va_list args;
19080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    va_start(args, format);
19180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    vsnprintf(buffer, BUFFER_SIZE, format, args);
19280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    va_end(args);
19380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
19480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (fDumper) {
19580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fDumper->dump(this, verb, buffer, paint);
19680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
19780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
19880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
19980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru///////////////////////////////////////////////////////////////////////////////
20080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
20180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruint SkDumpCanvas::save(SaveFlags flags) {
20280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dump(kSave_Verb, NULL, "save(0x%X)", flags);
20380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return this->INHERITED::save(flags);
20480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
20580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
20680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruint SkDumpCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
20780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                             SaveFlags flags) {
20880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString str;
20980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    str.printf("saveLayer(0x%X)", flags);
21080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (bounds) {
21180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        str.append(" bounds");
21280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        toString(*bounds, &str);
21380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
21480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (paint) {
21580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (paint->getAlpha() != 0xFF) {
21680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            str.appendf(" alpha:0x%02X", paint->getAlpha());
21780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
21880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (paint->getXfermode()) {
21980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            str.appendf(" xfermode:%p", paint->getXfermode());
22080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
22180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
22280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dump(kSave_Verb, paint, str.c_str());
22380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return this->INHERITED::saveLayer(bounds, paint, flags);
22480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
22580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
22680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDumpCanvas::restore() {
22780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->INHERITED::restore();
22880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dump(kRestore_Verb, NULL, "restore");
22980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
23080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
23180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDumpCanvas::translate(SkScalar dx, SkScalar dy) {
23280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dump(kMatrix_Verb, NULL, "translate(%g %g)",
23380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru               SkScalarToFloat(dx), SkScalarToFloat(dy));
23480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return this->INHERITED::translate(dx, dy);
23580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
23680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
23780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDumpCanvas::scale(SkScalar sx, SkScalar sy) {
23880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dump(kMatrix_Verb, NULL, "scale(%g %g)",
23980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru               SkScalarToFloat(sx), SkScalarToFloat(sy));
24080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return this->INHERITED::scale(sx, sy);
24180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
24280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
24380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDumpCanvas::rotate(SkScalar degrees) {
24480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dump(kMatrix_Verb, NULL, "rotate(%g)", SkScalarToFloat(degrees));
24580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return this->INHERITED::rotate(degrees);
24680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
24780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
24880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDumpCanvas::skew(SkScalar sx, SkScalar sy) {
24980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dump(kMatrix_Verb, NULL, "skew(%g %g)",
25080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru               SkScalarToFloat(sx), SkScalarToFloat(sy));
25180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return this->INHERITED::skew(sx, sy);
25280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
25380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
25480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDumpCanvas::concat(const SkMatrix& matrix) {
25580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString str;
256d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    matrix.toString(&str);
25780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dump(kMatrix_Verb, NULL, "concat(%s)", str.c_str());
25880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return this->INHERITED::concat(matrix);
25980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
26080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
26180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDumpCanvas::setMatrix(const SkMatrix& matrix) {
26280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString str;
263d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    matrix.toString(&str);
26480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dump(kMatrix_Verb, NULL, "setMatrix(%s)", str.c_str());
26580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->INHERITED::setMatrix(matrix);
26680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
26780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
26880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru///////////////////////////////////////////////////////////////////////////////
26980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
27080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const char* bool_to_aastring(bool doAA) {
27180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return doAA ? "AA" : "BW";
27280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
27380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
27480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDumpCanvas::clipRect(const SkRect& rect, SkRegion::Op op, bool doAA) {
27580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString str;
27680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    toString(rect, &str);
27780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dump(kClip_Verb, NULL, "clipRect(%s %s %s)", str.c_str(), toString(op),
27880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru               bool_to_aastring(doAA));
27980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return this->INHERITED::clipRect(rect, op, doAA);
28080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
28180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
282363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerbool SkDumpCanvas::clipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA) {
283363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    SkString str;
284363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    toString(rrect, &str);
285363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    this->dump(kClip_Verb, NULL, "clipRRect(%s %s %s)", str.c_str(), toString(op),
286363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger               bool_to_aastring(doAA));
287363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    return this->INHERITED::clipRRect(rrect, op, doAA);
288363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}
289363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
29080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDumpCanvas::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) {
29180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString str;
29280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    toString(path, &str);
29380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dump(kClip_Verb, NULL, "clipPath(%s %s %s)", str.c_str(), toString(op),
29480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru               bool_to_aastring(doAA));
29580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return this->INHERITED::clipPath(path, op, doAA);
29680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
29780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
29880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkDumpCanvas::clipRegion(const SkRegion& deviceRgn, SkRegion::Op op) {
29980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString str;
30080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    toString(deviceRgn, &str);
30180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dump(kClip_Verb, NULL, "clipRegion(%s %s)", str.c_str(),
30280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru               toString(op));
30380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return this->INHERITED::clipRegion(deviceRgn, op);
30480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
30580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
30680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru///////////////////////////////////////////////////////////////////////////////
30780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
30880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDumpCanvas::drawPaint(const SkPaint& paint) {
30980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dump(kDrawPaint_Verb, &paint, "drawPaint()");
31080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
31180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
31280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDumpCanvas::drawPoints(PointMode mode, size_t count,
31380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                               const SkPoint pts[], const SkPaint& paint) {
31480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dump(kDrawPoints_Verb, &paint, "drawPoints(%s, %d)", toString(mode),
31580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru               count);
31680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
31780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
318363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergervoid SkDumpCanvas::drawOval(const SkRect& rect, const SkPaint& paint) {
319363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    SkString str;
320363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    toString(rect, &str);
321363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    this->dump(kDrawOval_Verb, &paint, "drawOval(%s)", str.c_str());
322363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}
323363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
32480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDumpCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
32580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString str;
32680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    toString(rect, &str);
32780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dump(kDrawRect_Verb, &paint, "drawRect(%s)", str.c_str());
32880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
32980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
330363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergervoid SkDumpCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
331363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    SkString str;
332363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    toString(rrect, &str);
333363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    this->dump(kDrawRRect_Verb, &paint, "drawRRect(%s)", str.c_str());
334363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}
335363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
33680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDumpCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
33780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString str;
33880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    toString(path, &str);
33980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dump(kDrawPath_Verb, &paint, "drawPath(%s)", str.c_str());
34080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
34180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
34280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDumpCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y,
34380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                               const SkPaint* paint) {
34480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString str;
345d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    bitmap.toString(&str);
34680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dump(kDrawBitmap_Verb, paint, "drawBitmap(%s %g %g)", str.c_str(),
34780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru               SkScalarToFloat(x), SkScalarToFloat(y));
34880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
34980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
35080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDumpCanvas::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src,
3510a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                                        const SkRect& dst, const SkPaint* paint,
3520a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger                                        DrawBitmapRectFlags flags) {
35380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString bs, rs;
354d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    bitmap.toString(&bs);
35580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    toString(dst, &rs);
35680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // show the src-rect only if its not everything
35780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (src && (src->fLeft > 0 || src->fTop > 0 ||
35880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                src->fRight < SkIntToScalar(bitmap.width()) ||
35980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                src->fBottom < SkIntToScalar(bitmap.height()))) {
36080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkString ss;
36180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        toString(*src, &ss);
36280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        rs.prependf("%s ", ss.c_str());
36380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
36480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
36580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dump(kDrawBitmap_Verb, paint, "drawBitmapRectToRect(%s %s)",
36680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru               bs.c_str(), rs.c_str());
36780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
36880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
36980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDumpCanvas::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m,
37080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                     const SkPaint* paint) {
37180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString bs, ms;
372d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    bitmap.toString(&bs);
373d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    m.toString(&ms);
37480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dump(kDrawBitmap_Verb, paint, "drawBitmapMatrix(%s %s)",
37580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru               bs.c_str(), ms.c_str());
37680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
37780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
37880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDumpCanvas::drawSprite(const SkBitmap& bitmap, int x, int y,
37980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                               const SkPaint* paint) {
38080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString str;
381d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    bitmap.toString(&str);
38280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dump(kDrawBitmap_Verb, paint, "drawSprite(%s %d %d)", str.c_str(),
38380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru               x, y);
38480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
38580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
38680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDumpCanvas::drawText(const void* text, size_t byteLength, SkScalar x,
38780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                             SkScalar y, const SkPaint& paint) {
38880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString str;
38980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    toString(text, byteLength, paint.getTextEncoding(), &str);
39080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dump(kDrawText_Verb, &paint, "drawText(%s [%d] %g %g)", str.c_str(),
39180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru               byteLength, SkScalarToFloat(x), SkScalarToFloat(y));
39280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
39380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
39480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDumpCanvas::drawPosText(const void* text, size_t byteLength,
39580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                const SkPoint pos[], const SkPaint& paint) {
39680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString str;
39780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    toString(text, byteLength, paint.getTextEncoding(), &str);
39880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dump(kDrawText_Verb, &paint, "drawPosText(%s [%d] %g %g ...)",
39980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru               str.c_str(), byteLength, SkScalarToFloat(pos[0].fX),
40080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru               SkScalarToFloat(pos[0].fY));
40180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
40280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
40380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDumpCanvas::drawPosTextH(const void* text, size_t byteLength,
40480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                 const SkScalar xpos[], SkScalar constY,
40580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                 const SkPaint& paint) {
40680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString str;
40780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    toString(text, byteLength, paint.getTextEncoding(), &str);
40880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dump(kDrawText_Verb, &paint, "drawPosTextH(%s [%d] %g %g ...)",
40980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru               str.c_str(), byteLength, SkScalarToFloat(xpos[0]),
41080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru               SkScalarToFloat(constY));
41180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
41280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
41380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDumpCanvas::drawTextOnPath(const void* text, size_t byteLength,
41480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                   const SkPath& path, const SkMatrix* matrix,
41580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                   const SkPaint& paint) {
41680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString str;
41780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    toString(text, byteLength, paint.getTextEncoding(), &str);
41880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dump(kDrawText_Verb, &paint, "drawTextOnPath(%s [%d])",
41980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru               str.c_str(), byteLength);
42080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
42180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
42280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDumpCanvas::drawPicture(SkPicture& picture) {
42380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dump(kDrawPicture_Verb, NULL, "drawPicture(%p) %d:%d", &picture,
42480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru               picture.width(), picture.height());
42580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fNestLevel += 1;
42680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->INHERITED::drawPicture(picture);
42780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fNestLevel -= 1;
42880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dump(kDrawPicture_Verb, NULL, "endPicture(%p) %d:%d", &picture,
42980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru               picture.width(), picture.height());
43080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
43180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
43280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDumpCanvas::drawVertices(VertexMode vmode, int vertexCount,
43380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                 const SkPoint vertices[], const SkPoint texs[],
43480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                 const SkColor colors[], SkXfermode* xmode,
43580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                 const uint16_t indices[], int indexCount,
43680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                 const SkPaint& paint) {
43780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dump(kDrawVertices_Verb, &paint, "drawVertices(%s [%d] %g %g ...)",
43880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru               toString(vmode), vertexCount, SkScalarToFloat(vertices[0].fX),
43980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru               SkScalarToFloat(vertices[0].fY));
44080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
44180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
44280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkDumpCanvas::drawData(const void* data, size_t length) {
44380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru//    this->dump(kDrawData_Verb, NULL, "drawData(%d)", length);
44480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->dump(kDrawData_Verb, NULL, "drawData(%d) %.*s", length,
4450a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger               SkTMin<size_t>(length, 64), data);
44680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
44780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
44858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergervoid SkDumpCanvas::beginCommentGroup(const char* description) {
44958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    this->dump(kBeginCommentGroup_Verb, NULL, "beginCommentGroup(%s)", description);
45058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger}
45158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
45258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergervoid SkDumpCanvas::addComment(const char* kywd, const char* value) {
45358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    this->dump(kAddComment_Verb, NULL, "addComment(%s, %s)", kywd, value);
45458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger}
45558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
45658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergervoid SkDumpCanvas::endCommentGroup() {
45758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    this->dump(kEndCommentGroup_Verb, NULL, "endCommentGroup()");
45858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger}
45958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
46080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru///////////////////////////////////////////////////////////////////////////////
46180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru///////////////////////////////////////////////////////////////////////////////
46280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
46380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkFormatDumper::SkFormatDumper(void (*proc)(const char*, void*), void* refcon) {
46480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fProc = proc;
46580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fRefcon = refcon;
46680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
46780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
46880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void appendPtr(SkString* str, const void* ptr, const char name[]) {
46980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (ptr) {
47080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        str->appendf(" %s:%p", name, ptr);
47180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
47280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
47380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
47480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void appendFlattenable(SkString* str, const SkFlattenable* ptr,
47580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                              const char name[]) {
47680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (ptr) {
47780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        str->appendf(" %s:%p", name, ptr);
47880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
47980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
48080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
48180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkFormatDumper::dump(SkDumpCanvas* canvas, SkDumpCanvas::Verb verb,
48280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                          const char str[], const SkPaint* p) {
48380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString msg, tab;
48480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const int level = canvas->getNestLevel() + canvas->getSaveCount() - 1;
48580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkASSERT(level >= 0);
48680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    for (int i = 0; i < level; i++) {
48780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if 0
48880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        tab.append("\t");
48980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#else
49080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        tab.append("    ");   // tabs are often too wide to be useful
49180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
49280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
49380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    msg.printf("%s%s", tab.c_str(), str);
49480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
49580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (p) {
49680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        msg.appendf(" color:0x%08X flags:%X", p->getColor(), p->getFlags());
49780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        appendFlattenable(&msg, p->getShader(), "shader");
49880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        appendFlattenable(&msg, p->getXfermode(), "xfermode");
49980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        appendFlattenable(&msg, p->getPathEffect(), "pathEffect");
50080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        appendFlattenable(&msg, p->getMaskFilter(), "maskFilter");
50180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        appendFlattenable(&msg, p->getPathEffect(), "pathEffect");
50280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        appendFlattenable(&msg, p->getColorFilter(), "filter");
50380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
50480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (SkDumpCanvas::kDrawText_Verb == verb) {
50580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            msg.appendf(" textSize:%g", SkScalarToFloat(p->getTextSize()));
50680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            appendPtr(&msg, p->getTypeface(), "typeface");
50780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
50858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
50958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        if (p->getStyle() != SkPaint::kFill_Style) {
51058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            msg.appendf(" strokeWidth:%g", SkScalarToFloat(p->getStrokeWidth()));
51158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        }
51280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
51380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
51480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fProc(msg.c_str(), fRefcon);
51580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
51680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
51780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru///////////////////////////////////////////////////////////////////////////////
51880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
51980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void dumpToDebugf(const char text[], void*) {
52080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDebugf("%s\n", text);
52180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
52280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
52380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkDebugfDumper::SkDebugfDumper() : INHERITED(dumpToDebugf, NULL) {}
52480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
525d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger#endif
526