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