SkDumpCanvas.h revision ab5827354e2c23624acc3fc1fe4a83788bc99e96
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,
530a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com        kEndCommentGroup_Verb
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    };
5574b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    /** Subclasses of this are installed on the DumpCanvas, and then called for
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        each drawing command.
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com     */
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    class Dumper : public SkRefCnt {
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    public:
61563a3b410269a987b70204d0aa44a0de3a1f0f61reed@google.com        SK_DECLARE_INST_COUNT(Dumper)
62563a3b410269a987b70204d0aa44a0de3a1f0f61reed@google.com
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        virtual void dump(SkDumpCanvas*, SkDumpCanvas::Verb, const char str[],
648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                          const SkPaint*) = 0;
65fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
66563a3b410269a987b70204d0aa44a0de3a1f0f61reed@google.com    private:
67563a3b410269a987b70204d0aa44a0de3a1f0f61reed@google.com        typedef SkRefCnt INHERITED;
688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    };
6974b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    Dumper* getDumper() const { return fDumper; }
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void    setDumper(Dumper*);
7274b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
739b46e77ec2b387f4502926c2b9bf09450eec257creed@android.com    int getNestLevel() const { return fNestLevel; }
7474b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
7543d748446a880c46d5b1ad8828cdbf796c07d9d9reed@google.com    virtual int save(SaveFlags) SK_OVERRIDE;
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual int saveLayer(const SkRect* bounds, const SkPaint* paint,
7743d748446a880c46d5b1ad8828cdbf796c07d9d9reed@google.com                          SaveFlags) SK_OVERRIDE;
782d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com    virtual void restore() SK_OVERRIDE;
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
802d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com    virtual bool translate(SkScalar dx, SkScalar dy) SK_OVERRIDE;
812d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com    virtual bool scale(SkScalar sx, SkScalar sy) SK_OVERRIDE;
822d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com    virtual bool rotate(SkScalar degrees) SK_OVERRIDE;
832d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com    virtual bool skew(SkScalar sx, SkScalar sy) SK_OVERRIDE;
842d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com    virtual bool concat(const SkMatrix& matrix) SK_OVERRIDE;
852d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com    virtual void setMatrix(const SkMatrix& matrix) SK_OVERRIDE;
8674b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
87071eef918d70b6ca8334bc1241d1ea6923e828d5reed@google.com    virtual bool clipRect(const SkRect&, SkRegion::Op, bool) SK_OVERRIDE;
884ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    virtual bool clipRRect(const SkRRect&, SkRegion::Op, bool) SK_OVERRIDE;
89071eef918d70b6ca8334bc1241d1ea6923e828d5reed@google.com    virtual bool clipPath(const SkPath&, SkRegion::Op, bool) SK_OVERRIDE;
908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual bool clipRegion(const SkRegion& deviceRgn,
9143d748446a880c46d5b1ad8828cdbf796c07d9d9reed@google.com                            SkRegion::Op) SK_OVERRIDE;
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
932d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com    virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE;
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawPoints(PointMode mode, size_t count, const SkPoint pts[],
952d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                            const SkPaint& paint) SK_OVERRIDE;
964ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    virtual void drawOval(const SkRect&, const SkPaint& paint) SK_OVERRIDE;
977ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.com    virtual void drawRect(const SkRect&, const SkPaint& paint) SK_OVERRIDE;
984ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    virtual void drawRRect(const SkRRect&, const SkPaint& paint) SK_OVERRIDE;
997ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.com    virtual void drawPath(const SkPath& path, const SkPaint& paint) SK_OVERRIDE;
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar top,
10143d748446a880c46d5b1ad8828cdbf796c07d9d9reed@google.com                            const SkPaint* paint) SK_OVERRIDE;
1027112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com    virtual void drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src,
103eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org                                      const SkRect& dst, const SkPaint* paint,
104eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org                                      DrawBitmapRectFlags flags) SK_OVERRIDE;
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m,
10643d748446a880c46d5b1ad8828cdbf796c07d9d9reed@google.com                                  const SkPaint* paint) SK_OVERRIDE;
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawSprite(const SkBitmap& bitmap, int left, int top,
10843d748446a880c46d5b1ad8828cdbf796c07d9d9reed@google.com                            const SkPaint* paint) SK_OVERRIDE;
1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawText(const void* text, size_t byteLength, SkScalar x,
1102d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                          SkScalar y, const SkPaint& paint) SK_OVERRIDE;
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawPosText(const void* text, size_t byteLength,
1122d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                             const SkPoint pos[], const SkPaint& paint) SK_OVERRIDE;
1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawPosTextH(const void* text, size_t byteLength,
1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                              const SkScalar xpos[], SkScalar constY,
1152d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                              const SkPaint& paint) SK_OVERRIDE;
1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawTextOnPath(const void* text, size_t byteLength,
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                                const SkPath& path, const SkMatrix* matrix,
1182d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                                const SkPaint& paint) SK_OVERRIDE;
1192d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com    virtual void drawPicture(SkPicture&) SK_OVERRIDE;
1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawVertices(VertexMode vmode, int vertexCount,
1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                              const SkPoint vertices[], const SkPoint texs[],
1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                              const SkColor colors[], SkXfermode* xmode,
1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                              const uint16_t indices[], int indexCount,
1242d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                              const SkPaint& paint) SK_OVERRIDE;
1252d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com    virtual void drawData(const void*, size_t) SK_OVERRIDE;
1260a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com    virtual void beginCommentGroup(const char* description) SK_OVERRIDE;
1270a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com    virtual void addComment(const char* kywd, const char* value) SK_OVERRIDE;
1280a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com    virtual void endCommentGroup() SK_OVERRIDE;
1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
130ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.orgprotected:
131ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.org    virtual void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) SK_OVERRIDE;
132ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.org
1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    Dumper* fDumper;
1359b46e77ec2b387f4502926c2b9bf09450eec257creed@android.com    int     fNestLevel; // for nesting recursive elements like pictures
13674b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void dump(Verb, const SkPaint*, const char format[], ...);
1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkCanvas INHERITED;
1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Formats the draw commands, and send them to a function-pointer provided
1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    by the caller.
1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkFormatDumper : public SkDumpCanvas::Dumper {
1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkFormatDumper(void (*)(const char text[], void* refcon), void* refcon);
14874b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // override from baseclass that does the formatting, and in turn calls
1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // the function pointer that was passed to the constructor
1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void dump(SkDumpCanvas*, SkDumpCanvas::Verb, const char str[],
1522d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                      const SkPaint*) SK_OVERRIDE;
15374b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void (*fProc)(const char*, void*);
1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void* fRefcon;
15774b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkDumpCanvas::Dumper INHERITED;
1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Subclass of Dumper that dumps the drawing command to SkDebugf
1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkDebugfDumper : public SkFormatDumper {
1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDebugfDumper();
1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkFormatDumper INHERITED;
1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
17276f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com
17376f9e938df0b5826fd4c80b854ceafaf385cfbe1robertphillips@google.com#endif
174