SkDumpCanvas.h revision 79377cbceeea970b663e7934d7cb1f27bb223d98
10910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkDumpCanvas_DEFINED
20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkDumpCanvas_DEFINED
30910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkCanvas.h"
50910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
60910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** This class overrides all the draw methods on SkCanvas, and formats them
70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    as text, and then sends that to a Dumper helper object.
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Typical use might be to dump a display list to a log file to see what is
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    being drawn.
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkDumpCanvas : public SkCanvas {
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    class Dumper;
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    explicit SkDumpCanvas(Dumper* = 0);
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual ~SkDumpCanvas();
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    enum Verb {
200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kNULL_Verb,
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kSave_Verb,
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kRestore_Verb,
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kMatrix_Verb,
260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kClip_Verb,
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kDrawPaint_Verb,
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kDrawPoints_Verb,
310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kDrawRect_Verb,
320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kDrawPath_Verb,
330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kDrawBitmap_Verb,
340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kDrawText_Verb,
350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kDrawPicture_Verb,
36dab163f0b2658c2dba48839e72f81d3d8ee0ae8bMike Reed        kDrawShape_Verb,
370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        kDrawVertices_Verb
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** Subclasses of this are installed on the DumpCanvas, and then called for
410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        each drawing command.
420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project     */
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    class Dumper : public SkRefCnt {
440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    public:
450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        virtual void dump(SkDumpCanvas*, SkDumpCanvas::Verb, const char str[],
460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          const SkPaint*) = 0;
470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    };
480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Dumper* getDumper() const { return fDumper; }
500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void    setDumper(Dumper*);
510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
5279377cbceeea970b663e7934d7cb1f27bb223d98Mike Reed    int getNestLevel() const { return fNestLevel; }
5379377cbceeea970b663e7934d7cb1f27bb223d98Mike Reed
540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // overrides from SkCanvas
550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual int save(SaveFlags flags = kMatrixClip_SaveFlag);
570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual int saveLayer(const SkRect* bounds, const SkPaint* paint,
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          SaveFlags flags = kARGB_ClipLayer_SaveFlag);
590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void restore();
600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool translate(SkScalar dx, SkScalar dy);
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool scale(SkScalar sx, SkScalar sy);
630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool rotate(SkScalar degrees);
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool skew(SkScalar sx, SkScalar sy);
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool concat(const SkMatrix& matrix);
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void setMatrix(const SkMatrix& matrix);
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool clipRect(const SkRect& rect,
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          SkRegion::Op op = SkRegion::kIntersect_Op);
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool clipPath(const SkPath& path,
710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          SkRegion::Op op = SkRegion::kIntersect_Op);
720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual bool clipRegion(const SkRegion& deviceRgn,
730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            SkRegion::Op op = SkRegion::kIntersect_Op);
740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawPaint(const SkPaint& paint);
760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawPoints(PointMode mode, size_t count, const SkPoint pts[],
770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            const SkPaint& paint);
780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawRect(const SkRect& rect, const SkPaint& paint);
790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawPath(const SkPath& path, const SkPaint& paint);
800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar top,
810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            const SkPaint* paint = NULL);
820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawBitmapRect(const SkBitmap& bitmap, const SkIRect* src,
830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                const SkRect& dst, const SkPaint* paint = NULL);
840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m,
850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                  const SkPaint* paint = NULL);
860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawSprite(const SkBitmap& bitmap, int left, int top,
870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                            const SkPaint* paint = NULL);
880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawText(const void* text, size_t byteLength, SkScalar x,
890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                          SkScalar y, const SkPaint& paint);
900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawPosText(const void* text, size_t byteLength,
910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                             const SkPoint pos[], const SkPaint& paint);
920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawPosTextH(const void* text, size_t byteLength,
930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              const SkScalar xpos[], SkScalar constY,
940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              const SkPaint& paint);
950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawTextOnPath(const void* text, size_t byteLength,
960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                const SkPath& path, const SkMatrix* matrix,
970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                                const SkPaint& paint);
98dab163f0b2658c2dba48839e72f81d3d8ee0ae8bMike Reed    virtual void drawPicture(SkPicture&);
99dab163f0b2658c2dba48839e72f81d3d8ee0ae8bMike Reed    virtual void drawShape(SkShape*);
1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void drawVertices(VertexMode vmode, int vertexCount,
1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              const SkPoint vertices[], const SkPoint texs[],
1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              const SkColor colors[], SkXfermode* xmode,
1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              const uint16_t indices[], int indexCount,
1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                              const SkPaint& paint);
1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    Dumper* fDumper;
10879377cbceeea970b663e7934d7cb1f27bb223d98Mike Reed    int     fNestLevel; // for nesting recursive elements like pictures
1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void dump(Verb, const SkPaint*, const char format[], ...);
1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    typedef SkCanvas INHERITED;
1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Formats the draw commands, and send them to a function-pointer provided
1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    by the caller.
1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkFormatDumper : public SkDumpCanvas::Dumper {
1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkFormatDumper(void (*)(const char text[], void* refcon), void* refcon);
1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // override from baseclass that does the formatting, and in turn calls
1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    // the function pointer that was passed to the constructor
1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    virtual void dump(SkDumpCanvas*, SkDumpCanvas::Verb, const char str[],
1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project                      const SkPaint*);
1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void (*fProc)(const char*, void*);
1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    void* fRefcon;
1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    typedef SkDumpCanvas::Dumper INHERITED;
1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Subclass of Dumper that dumps the drawing command to SkDebugf
1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkDebugfDumper : public SkFormatDumper {
1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic:
1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    SkDebugfDumper();
1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate:
1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    typedef SkFormatDumper INHERITED;
1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project};
1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif
145