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,
490a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com        kDrawData_Verb,
500a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com
510a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com        kBeginCommentGroup_Verb,
520a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com        kAddComment_Verb,
53210ae2a42613b9048e8e8c4096c5bf4fe2ddf838commit-bot@chromium.org        kEndCommentGroup_Verb,
54210ae2a42613b9048e8e8c4096c5bf4fe2ddf838commit-bot@chromium.org
55210ae2a42613b9048e8e8c4096c5bf4fe2ddf838commit-bot@chromium.org        kCull_Verb
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    };
5774b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    /** Subclasses of this are installed on the DumpCanvas, and then called for
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        each drawing command.
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com     */
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    class Dumper : public SkRefCnt {
628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    public:
63563a3b410269a987b70204d0aa44a0de3a1f0f61reed@google.com        SK_DECLARE_INST_COUNT(Dumper)
64563a3b410269a987b70204d0aa44a0de3a1f0f61reed@google.com
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        virtual void dump(SkDumpCanvas*, SkDumpCanvas::Verb, const char str[],
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                          const SkPaint*) = 0;
67fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
68563a3b410269a987b70204d0aa44a0de3a1f0f61reed@google.com    private:
69563a3b410269a987b70204d0aa44a0de3a1f0f61reed@google.com        typedef SkRefCnt INHERITED;
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    };
7174b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    Dumper* getDumper() const { return fDumper; }
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void    setDumper(Dumper*);
7474b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
759b46e77ec2b387f4502926c2b9bf09450eec257creed@android.com    int getNestLevel() const { return fNestLevel; }
7674b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
772d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com    virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE;
788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawPoints(PointMode mode, size_t count, const SkPoint pts[],
792d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                            const SkPaint& paint) SK_OVERRIDE;
804ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    virtual void drawOval(const SkRect&, const SkPaint& paint) SK_OVERRIDE;
817ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.com    virtual void drawRect(const SkRect&, const SkPaint& paint) SK_OVERRIDE;
824ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    virtual void drawRRect(const SkRRect&, const SkPaint& paint) SK_OVERRIDE;
837ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.com    virtual void drawPath(const SkPath& path, const SkPaint& paint) SK_OVERRIDE;
848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar top,
8543d748446a880c46d5b1ad8828cdbf796c07d9d9reed@google.com                            const SkPaint* paint) SK_OVERRIDE;
867112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com    virtual void drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src,
87eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org                                      const SkRect& dst, const SkPaint* paint,
88eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org                                      DrawBitmapRectFlags flags) SK_OVERRIDE;
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m,
9043d748446a880c46d5b1ad8828cdbf796c07d9d9reed@google.com                                  const SkPaint* paint) SK_OVERRIDE;
918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawSprite(const SkBitmap& bitmap, int left, int top,
9243d748446a880c46d5b1ad8828cdbf796c07d9d9reed@google.com                            const SkPaint* paint) SK_OVERRIDE;
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawVertices(VertexMode vmode, int vertexCount,
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                              const SkPoint vertices[], const SkPoint texs[],
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                              const SkColor colors[], SkXfermode* xmode,
968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                              const uint16_t indices[], int indexCount,
972d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                              const SkPaint& paint) SK_OVERRIDE;
982d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com    virtual void drawData(const void*, size_t) SK_OVERRIDE;
990a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com    virtual void beginCommentGroup(const char* description) SK_OVERRIDE;
1000a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com    virtual void addComment(const char* kywd, const char* value) SK_OVERRIDE;
1010a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com    virtual void endCommentGroup() SK_OVERRIDE;
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
103ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.orgprotected:
104e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org    virtual void willSave(SaveFlags) SK_OVERRIDE;
105e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org    virtual SaveLayerStrategy willSaveLayer(const SkRect*, const SkPaint*, SaveFlags) SK_OVERRIDE;
106e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org    virtual void willRestore() SK_OVERRIDE;
107e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org
10844c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org    virtual void didConcat(const SkMatrix&) SK_OVERRIDE;
10944c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org    virtual void didSetMatrix(const SkMatrix&) SK_OVERRIDE;
11044c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org
111ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.org    virtual void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) SK_OVERRIDE;
112e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com    virtual void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
113e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com                            const SkPaint&) SK_OVERRIDE;
114e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com    virtual void onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[],
115e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com                               const SkPaint&) SK_OVERRIDE;
116e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com    virtual void onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
117e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com                                SkScalar constY, const SkPaint&) SK_OVERRIDE;
118e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com    virtual void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
119e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com                                  const SkMatrix* matrix, const SkPaint&) SK_OVERRIDE;
120210ae2a42613b9048e8e8c4096c5bf4fe2ddf838commit-bot@chromium.org    virtual void onPushCull(const SkRect& cullRect) SK_OVERRIDE;
121210ae2a42613b9048e8e8c4096c5bf4fe2ddf838commit-bot@chromium.org    virtual void onPopCull() SK_OVERRIDE;
122ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.org
1238f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com    virtual void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
1248f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com    virtual void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
1258f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com    virtual void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
1268f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com    virtual void onClipRegion(const SkRegion&, SkRegion::Op) SK_OVERRIDE;
1278f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com
1289b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips    virtual void onDrawPicture(const SkPicture*) SK_OVERRIDE;
1299b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips
1308f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com    static const char* EdgeStyleToAAString(ClipEdgeStyle edgeStyle);
1318f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com
1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    Dumper* fDumper;
1349b46e77ec2b387f4502926c2b9bf09450eec257creed@android.com    int     fNestLevel; // for nesting recursive elements like pictures
13574b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void dump(Verb, const SkPaint*, const char format[], ...);
1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkCanvas INHERITED;
1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Formats the draw commands, and send them to a function-pointer provided
1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    by the caller.
1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkFormatDumper : public SkDumpCanvas::Dumper {
1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkFormatDumper(void (*)(const char text[], void* refcon), void* refcon);
14774b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // override from baseclass that does the formatting, and in turn calls
1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // the function pointer that was passed to the constructor
1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void dump(SkDumpCanvas*, SkDumpCanvas::Verb, const char str[],
1512d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                      const SkPaint*) SK_OVERRIDE;
15274b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void (*fProc)(const char*, void*);
1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void* fRefcon;
15674b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkDumpCanvas::Dumper INHERITED;
1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Subclass of Dumper that dumps the drawing command to SkDebugf
1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkDebugfDumper : public SkFormatDumper {
1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDebugfDumper();
1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkFormatDumper INHERITED;
1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
17176f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com
17276f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com#endif
173