1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkDumpCanvas_DEFINED
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkDumpCanvas_DEFINED
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCanvas.h"
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1376f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com#ifdef SK_DEVELOPER
1476f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** This class overrides all the draw methods on SkCanvas, and formats them
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    as text, and then sends that to a Dumper helper object.
1774b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    Typical use might be to dump a display list to a log file to see what is
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    being drawn.
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkDumpCanvas : public SkCanvas {
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    class Dumper;
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    explicit SkDumpCanvas(Dumper* = 0);
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual ~SkDumpCanvas();
2774b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    enum Verb {
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kNULL_Verb,
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kSave_Verb,
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kRestore_Verb,
3374b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kMatrix_Verb,
3574b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kClip_Verb,
3774b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kDrawPaint_Verb,
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kDrawPoints_Verb,
404ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com        kDrawOval_Verb,
418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kDrawRect_Verb,
424ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com        kDrawRRect_Verb,
43ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.org        kDrawDRRect_Verb,
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kDrawPath_Verb,
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kDrawBitmap_Verb,
468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kDrawText_Verb,
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kDrawPicture_Verb,
48cb60844b34766aad4151df5e87c144d4a57e9abereed@android.com        kDrawVertices_Verb,
49963137b75c0a1fe91f35e9826742f36309f5e65ddandov        kDrawPatch_Verb,
50c4fda92f45b9649f233a5b8636618a6431aa59cbreed        kDrawData_Verb, // obsolete
510a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com
520a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com        kBeginCommentGroup_Verb,
530a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com        kAddComment_Verb,
54210ae2a42613b9048e8e8c4096c5bf4fe2ddf838commit-bot@chromium.org        kEndCommentGroup_Verb,
55210ae2a42613b9048e8e8c4096c5bf4fe2ddf838commit-bot@chromium.org
56210ae2a42613b9048e8e8c4096c5bf4fe2ddf838commit-bot@chromium.org        kCull_Verb
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    };
5874b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    /** Subclasses of this are installed on the DumpCanvas, and then called for
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        each drawing command.
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com     */
628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    class Dumper : public SkRefCnt {
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    public:
64563a3b410269a987b70204d0aa44a0de3a1f0f61reed@google.com        SK_DECLARE_INST_COUNT(Dumper)
65563a3b410269a987b70204d0aa44a0de3a1f0f61reed@google.com
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        virtual void dump(SkDumpCanvas*, SkDumpCanvas::Verb, const char str[],
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                          const SkPaint*) = 0;
68fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
69563a3b410269a987b70204d0aa44a0de3a1f0f61reed@google.com    private:
70563a3b410269a987b70204d0aa44a0de3a1f0f61reed@google.com        typedef SkRefCnt INHERITED;
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    };
7274b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    Dumper* getDumper() const { return fDumper; }
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void    setDumper(Dumper*);
7574b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
769b46e77ec2b387f4502926c2b9bf09450eec257creed@android.com    int getNestLevel() const { return fNestLevel; }
7774b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
7836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void beginCommentGroup(const char* description) override;
7936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void addComment(const char* kywd, const char* value) override;
8036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void endCommentGroup() override;
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
82ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.orgprotected:
8336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void willSave() override;
8436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SaveLayerStrategy willSaveLayer(const SkRect*, const SkPaint*, SaveFlags) override;
8536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void willRestore() override;
86e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org
8736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void didConcat(const SkMatrix&) override;
8836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void didSetMatrix(const SkMatrix&) override;
8944c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org
9036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override;
91e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com    virtual void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
9236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                            const SkPaint&) override;
93e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com    virtual void onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[],
9436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                               const SkPaint&) override;
95e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com    virtual void onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
9636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                                SkScalar constY, const SkPaint&) override;
97e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com    virtual void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
9836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                                  const SkMatrix* matrix, const SkPaint&) override;
99b7425173f96e93b090787e2386ba5f022b6c2869fmalita    virtual void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
10036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                                const SkPaint& paint) override;
101b3c9d1c33caf325aada244204215eb790c228c12dandov    virtual void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
102b3c9d1c33caf325aada244204215eb790c228c12dandov                             const SkPoint texCoords[4], SkXfermode* xmode,
10336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                             const SkPaint& paint) override;
10436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein
10536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDrawPaint(const SkPaint&) override;
10636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPaint&) override;
10736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDrawRect(const SkRect&, const SkPaint&) override;
10836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDrawOval(const SkRect&, const SkPaint&) override;
10936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDrawRRect(const SkRRect&, const SkPaint&) override;
11036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDrawPath(const SkPath&, const SkPaint&) override;
11136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDrawBitmap(const SkBitmap&, SkScalar left, SkScalar top, const SkPaint*) override;
11241af966ab338e95eee81ab618ab28195075338f7reed    void onDrawBitmapRect(const SkBitmap&, const SkRect* src, const SkRect& dst, const SkPaint*,
11336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                          DrawBitmapRectFlags flags) override;
11436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDrawImage(const SkImage*, SkScalar left, SkScalar top, const SkPaint*) override;
11541af966ab338e95eee81ab618ab28195075338f7reed    void onDrawImageRect(const SkImage*, const SkRect* src, const SkRect& dst,
11636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                         const SkPaint*) override;
11741af966ab338e95eee81ab618ab28195075338f7reed    void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect& dst,
11836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                          const SkPaint*) override;
11936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDrawSprite(const SkBitmap&, int left, int top, const SkPaint*) override;
12041af966ab338e95eee81ab618ab28195075338f7reed    void onDrawVertices(VertexMode vmode, int vertexCount,
12141af966ab338e95eee81ab618ab28195075338f7reed                        const SkPoint vertices[], const SkPoint texs[],
12241af966ab338e95eee81ab618ab28195075338f7reed                        const SkColor colors[], SkXfermode* xmode,
12341af966ab338e95eee81ab618ab28195075338f7reed                        const uint16_t indices[], int indexCount,
12436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                        const SkPaint&) override;
12541af966ab338e95eee81ab618ab28195075338f7reed
12636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) override;
12736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) override;
12836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) override;
12936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onClipRegion(const SkRegion&, SkRegion::Op) override;
1308f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com
13136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) override;
1329b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips
1338f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com    static const char* EdgeStyleToAAString(ClipEdgeStyle edgeStyle);
1348f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com
1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    Dumper* fDumper;
1379b46e77ec2b387f4502926c2b9bf09450eec257creed@android.com    int     fNestLevel; // for nesting recursive elements like pictures
13874b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void dump(Verb, const SkPaint*, const char format[], ...);
1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkCanvas INHERITED;
1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Formats the draw commands, and send them to a function-pointer provided
1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    by the caller.
1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkFormatDumper : public SkDumpCanvas::Dumper {
1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkFormatDumper(void (*)(const char text[], void* refcon), void* refcon);
15074b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // override from baseclass that does the formatting, and in turn calls
1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // the function pointer that was passed to the constructor
1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void dump(SkDumpCanvas*, SkDumpCanvas::Verb, const char str[],
15436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                      const SkPaint*) override;
15574b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void (*fProc)(const char*, void*);
1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void* fRefcon;
15974b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkDumpCanvas::Dumper INHERITED;
1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Subclass of Dumper that dumps the drawing command to SkDebugf
1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkDebugfDumper : public SkFormatDumper {
1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDebugfDumper();
1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkFormatDumper INHERITED;
1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
17476f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com
17576f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com#endif
176