SkDumpCanvas.h revision 2d4297cfa40e69ef155b70614d5cee6a6c21d2f9
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
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** This class overrides all the draw methods on SkCanvas, and formats them
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    as text, and then sends that to a Dumper helper object.
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    Typical use might be to dump a display list to a log file to see what is
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    being drawn.
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkDumpCanvas : public SkCanvas {
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    class Dumper;
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    explicit SkDumpCanvas(Dumper* = 0);
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual ~SkDumpCanvas();
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    enum Verb {
278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kNULL_Verb,
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kSave_Verb,
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kRestore_Verb,
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kMatrix_Verb,
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kClip_Verb,
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kDrawPaint_Verb,
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kDrawPoints_Verb,
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kDrawRect_Verb,
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kDrawPath_Verb,
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kDrawBitmap_Verb,
418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kDrawText_Verb,
428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        kDrawPicture_Verb,
43cb60844b34766aad4151df5e87c144d4a57e9abereed@android.com        kDrawVertices_Verb,
44cb60844b34766aad4151df5e87c144d4a57e9abereed@android.com        kDrawData_Verb
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    };
468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    /** Subclasses of this are installed on the DumpCanvas, and then called for
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        each drawing command.
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com     */
508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    class Dumper : public SkRefCnt {
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    public:
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        virtual void dump(SkDumpCanvas*, SkDumpCanvas::Verb, const char str[],
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                          const SkPaint*) = 0;
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    };
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    Dumper* getDumper() const { return fDumper; }
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void    setDumper(Dumper*);
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
599b46e77ec2b387f4502926c2b9bf09450eec257creed@android.com    int getNestLevel() const { return fNestLevel; }
609b46e77ec2b387f4502926c2b9bf09450eec257creed@android.com
612d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com    virtual int save(SaveFlags flags = kMatrixClip_SaveFlag) SK_OVERRIDE;
628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual int saveLayer(const SkRect* bounds, const SkPaint* paint,
632d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                          SaveFlags flags = kARGB_ClipLayer_SaveFlag) SK_OVERRIDE;
642d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com    virtual void restore() SK_OVERRIDE;
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
662d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com    virtual bool translate(SkScalar dx, SkScalar dy) SK_OVERRIDE;
672d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com    virtual bool scale(SkScalar sx, SkScalar sy) SK_OVERRIDE;
682d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com    virtual bool rotate(SkScalar degrees) SK_OVERRIDE;
692d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com    virtual bool skew(SkScalar sx, SkScalar sy) SK_OVERRIDE;
702d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com    virtual bool concat(const SkMatrix& matrix) SK_OVERRIDE;
712d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com    virtual void setMatrix(const SkMatrix& matrix) SK_OVERRIDE;
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual bool clipRect(const SkRect& rect,
742d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                          SkRegion::Op op = SkRegion::kIntersect_Op) SK_OVERRIDE;
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual bool clipPath(const SkPath& path,
762d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                          SkRegion::Op op = SkRegion::kIntersect_Op) SK_OVERRIDE;
778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual bool clipRegion(const SkRegion& deviceRgn,
782d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                            SkRegion::Op op = SkRegion::kIntersect_Op) SK_OVERRIDE;
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
802d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com    virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE;
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawPoints(PointMode mode, size_t count, const SkPoint pts[],
822d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                            const SkPaint& paint) SK_OVERRIDE;
832d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com    virtual void drawRect(const SkRect& rect, const SkPaint& paint) SK_OVERRIDE;
842d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com    virtual void drawPath(const SkPath& path, const SkPaint& paint) SK_OVERRIDE;
858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar top,
862d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                            const SkPaint* paint = NULL) SK_OVERRIDE;
878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawBitmapRect(const SkBitmap& bitmap, const SkIRect* src,
882d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                                const SkRect& dst, const SkPaint* paint = NULL) SK_OVERRIDE;
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m,
902d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                                  const SkPaint* paint = NULL) SK_OVERRIDE;
918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawSprite(const SkBitmap& bitmap, int left, int top,
922d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                            const SkPaint* paint = NULL) SK_OVERRIDE;
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawText(const void* text, size_t byteLength, SkScalar x,
942d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                          SkScalar y, const SkPaint& paint) SK_OVERRIDE;
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawPosText(const void* text, size_t byteLength,
962d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                             const SkPoint pos[], const SkPaint& paint) SK_OVERRIDE;
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawPosTextH(const void* text, size_t byteLength,
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                              const SkScalar xpos[], SkScalar constY,
992d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                              const SkPaint& paint) SK_OVERRIDE;
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawTextOnPath(const void* text, size_t byteLength,
1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                                const SkPath& path, const SkMatrix* matrix,
1022d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                                const SkPaint& paint) SK_OVERRIDE;
1032d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com    virtual void drawPicture(SkPicture&) SK_OVERRIDE;
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawVertices(VertexMode vmode, int vertexCount,
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                              const SkPoint vertices[], const SkPoint texs[],
1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                              const SkColor colors[], SkXfermode* xmode,
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                              const uint16_t indices[], int indexCount,
1082d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                              const SkPaint& paint) SK_OVERRIDE;
1092d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com    virtual void drawData(const void*, size_t) SK_OVERRIDE;
1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    Dumper* fDumper;
1139b46e77ec2b387f4502926c2b9bf09450eec257creed@android.com    int     fNestLevel; // for nesting recursive elements like pictures
1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void dump(Verb, const SkPaint*, const char format[], ...);
1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkCanvas INHERITED;
1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Formats the draw commands, and send them to a function-pointer provided
1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    by the caller.
1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkFormatDumper : public SkDumpCanvas::Dumper {
1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkFormatDumper(void (*)(const char text[], void* refcon), void* refcon);
1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // override from baseclass that does the formatting, and in turn calls
1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // the function pointer that was passed to the constructor
1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void dump(SkDumpCanvas*, SkDumpCanvas::Verb, const char str[],
1302d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                      const SkPaint*) SK_OVERRIDE;
1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void (*fProc)(const char*, void*);
1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void* fRefcon;
1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkDumpCanvas::Dumper INHERITED;
1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Subclass of Dumper that dumps the drawing command to SkDebugf
1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkDebugfDumper : public SkFormatDumper {
1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkDebugfDumper();
1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkFormatDumper INHERITED;
1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
150