Home | History | Annotate | Download | only in utils
      1 #ifndef SkDumpCanvas_DEFINED
      2 #define SkDumpCanvas_DEFINED
      3 
      4 #include "SkCanvas.h"
      5 
      6 /** This class overrides all the draw methods on SkCanvas, and formats them
      7     as text, and then sends that to a Dumper helper object.
      8 
      9     Typical use might be to dump a display list to a log file to see what is
     10     being drawn.
     11  */
     12 class SkDumpCanvas : public SkCanvas {
     13 public:
     14     class Dumper;
     15 
     16     explicit SkDumpCanvas(Dumper* = 0);
     17     virtual ~SkDumpCanvas();
     18 
     19     enum Verb {
     20         kNULL_Verb,
     21 
     22         kSave_Verb,
     23         kRestore_Verb,
     24 
     25         kMatrix_Verb,
     26 
     27         kClip_Verb,
     28 
     29         kDrawPaint_Verb,
     30         kDrawPoints_Verb,
     31         kDrawRect_Verb,
     32         kDrawPath_Verb,
     33         kDrawBitmap_Verb,
     34         kDrawText_Verb,
     35         kDrawPicture_Verb,
     36         kDrawShape_Verb,
     37         kDrawVertices_Verb,
     38         kDrawData_Verb
     39     };
     40 
     41     /** Subclasses of this are installed on the DumpCanvas, and then called for
     42         each drawing command.
     43      */
     44     class Dumper : public SkRefCnt {
     45     public:
     46         virtual void dump(SkDumpCanvas*, SkDumpCanvas::Verb, const char str[],
     47                           const SkPaint*) = 0;
     48     };
     49 
     50     Dumper* getDumper() const { return fDumper; }
     51     void    setDumper(Dumper*);
     52 
     53     int getNestLevel() const { return fNestLevel; }
     54 
     55     // overrides from SkCanvas
     56 
     57     virtual int save(SaveFlags flags = kMatrixClip_SaveFlag);
     58     virtual int saveLayer(const SkRect* bounds, const SkPaint* paint,
     59                           SaveFlags flags = kARGB_ClipLayer_SaveFlag);
     60     virtual void restore();
     61 
     62     virtual bool translate(SkScalar dx, SkScalar dy);
     63     virtual bool scale(SkScalar sx, SkScalar sy);
     64     virtual bool rotate(SkScalar degrees);
     65     virtual bool skew(SkScalar sx, SkScalar sy);
     66     virtual bool concat(const SkMatrix& matrix);
     67     virtual void setMatrix(const SkMatrix& matrix);
     68 
     69     virtual bool clipRect(const SkRect& rect,
     70                           SkRegion::Op op = SkRegion::kIntersect_Op);
     71     virtual bool clipPath(const SkPath& path,
     72                           SkRegion::Op op = SkRegion::kIntersect_Op);
     73     virtual bool clipRegion(const SkRegion& deviceRgn,
     74                             SkRegion::Op op = SkRegion::kIntersect_Op);
     75 
     76     virtual void drawPaint(const SkPaint& paint);
     77     virtual void drawPoints(PointMode mode, size_t count, const SkPoint pts[],
     78                             const SkPaint& paint);
     79     virtual void drawRect(const SkRect& rect, const SkPaint& paint);
     80     virtual void drawPath(const SkPath& path, const SkPaint& paint);
     81     virtual void drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar top,
     82                             const SkPaint* paint = NULL);
     83     virtual void drawBitmapRect(const SkBitmap& bitmap, const SkIRect* src,
     84                                 const SkRect& dst, const SkPaint* paint = NULL);
     85     virtual void drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m,
     86                                   const SkPaint* paint = NULL);
     87     virtual void drawSprite(const SkBitmap& bitmap, int left, int top,
     88                             const SkPaint* paint = NULL);
     89     virtual void drawText(const void* text, size_t byteLength, SkScalar x,
     90                           SkScalar y, const SkPaint& paint);
     91     virtual void drawPosText(const void* text, size_t byteLength,
     92                              const SkPoint pos[], const SkPaint& paint);
     93     virtual void drawPosTextH(const void* text, size_t byteLength,
     94                               const SkScalar xpos[], SkScalar constY,
     95                               const SkPaint& paint);
     96     virtual void drawTextOnPath(const void* text, size_t byteLength,
     97                                 const SkPath& path, const SkMatrix* matrix,
     98                                 const SkPaint& paint);
     99     virtual void drawPicture(SkPicture&);
    100     virtual void drawShape(SkShape*);
    101     virtual void drawVertices(VertexMode vmode, int vertexCount,
    102                               const SkPoint vertices[], const SkPoint texs[],
    103                               const SkColor colors[], SkXfermode* xmode,
    104                               const uint16_t indices[], int indexCount,
    105                               const SkPaint& paint);
    106     virtual void drawData(const void*, size_t);
    107 
    108 private:
    109     Dumper* fDumper;
    110     int     fNestLevel; // for nesting recursive elements like pictures
    111 
    112     void dump(Verb, const SkPaint*, const char format[], ...);
    113 
    114     typedef SkCanvas INHERITED;
    115 };
    116 
    117 /** Formats the draw commands, and send them to a function-pointer provided
    118     by the caller.
    119  */
    120 class SkFormatDumper : public SkDumpCanvas::Dumper {
    121 public:
    122     SkFormatDumper(void (*)(const char text[], void* refcon), void* refcon);
    123 
    124     // override from baseclass that does the formatting, and in turn calls
    125     // the function pointer that was passed to the constructor
    126     virtual void dump(SkDumpCanvas*, SkDumpCanvas::Verb, const char str[],
    127                       const SkPaint*);
    128 
    129 private:
    130     void (*fProc)(const char*, void*);
    131     void* fRefcon;
    132 
    133     typedef SkDumpCanvas::Dumper INHERITED;
    134 };
    135 
    136 /** Subclass of Dumper that dumps the drawing command to SkDebugf
    137  */
    138 class SkDebugfDumper : public SkFormatDumper {
    139 public:
    140     SkDebugfDumper();
    141 
    142 private:
    143     typedef SkFormatDumper INHERITED;
    144 };
    145 
    146 #endif
    147