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 #ifdef SK_DEVELOPER 14 15 /** This class overrides all the draw methods on SkCanvas, and formats them 16 as text, and then sends that to a Dumper helper object. 17 18 Typical use might be to dump a display list to a log file to see what is 19 being drawn. 20 */ 21 class SkDumpCanvas : public SkCanvas { 22 public: 23 class Dumper; 24 25 explicit SkDumpCanvas(Dumper* = 0); 26 virtual ~SkDumpCanvas(); 27 28 enum Verb { 29 kNULL_Verb, 30 31 kSave_Verb, 32 kRestore_Verb, 33 34 kMatrix_Verb, 35 36 kClip_Verb, 37 38 kDrawPaint_Verb, 39 kDrawPoints_Verb, 40 kDrawOval_Verb, 41 kDrawRect_Verb, 42 kDrawRRect_Verb, 43 kDrawDRRect_Verb, 44 kDrawPath_Verb, 45 kDrawBitmap_Verb, 46 kDrawText_Verb, 47 kDrawPicture_Verb, 48 kDrawVertices_Verb, 49 kDrawData_Verb, 50 51 kBeginCommentGroup_Verb, 52 kAddComment_Verb, 53 kEndCommentGroup_Verb, 54 55 kCull_Verb 56 }; 57 58 /** Subclasses of this are installed on the DumpCanvas, and then called for 59 each drawing command. 60 */ 61 class Dumper : public SkRefCnt { 62 public: 63 SK_DECLARE_INST_COUNT(Dumper) 64 65 virtual void dump(SkDumpCanvas*, SkDumpCanvas::Verb, const char str[], 66 const SkPaint*) = 0; 67 68 private: 69 typedef SkRefCnt INHERITED; 70 }; 71 getDumper()72 Dumper* getDumper() const { return fDumper; } 73 void setDumper(Dumper*); 74 getNestLevel()75 int getNestLevel() const { return fNestLevel; } 76 77 virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE; 78 virtual void drawPoints(PointMode mode, size_t count, const SkPoint pts[], 79 const SkPaint& paint) SK_OVERRIDE; 80 virtual void drawOval(const SkRect&, const SkPaint& paint) SK_OVERRIDE; 81 virtual void drawRect(const SkRect&, const SkPaint& paint) SK_OVERRIDE; 82 virtual void drawRRect(const SkRRect&, const SkPaint& paint) SK_OVERRIDE; 83 virtual void drawPath(const SkPath& path, const SkPaint& paint) SK_OVERRIDE; 84 virtual void drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar top, 85 const SkPaint* paint) SK_OVERRIDE; 86 virtual void drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src, 87 const SkRect& dst, const SkPaint* paint, 88 DrawBitmapRectFlags flags) SK_OVERRIDE; 89 virtual void drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m, 90 const SkPaint* paint) SK_OVERRIDE; 91 virtual void drawSprite(const SkBitmap& bitmap, int left, int top, 92 const SkPaint* paint) SK_OVERRIDE; 93 virtual void drawVertices(VertexMode vmode, int vertexCount, 94 const SkPoint vertices[], const SkPoint texs[], 95 const SkColor colors[], SkXfermode* xmode, 96 const uint16_t indices[], int indexCount, 97 const SkPaint& paint) SK_OVERRIDE; 98 virtual void drawData(const void*, size_t) SK_OVERRIDE; 99 virtual void beginCommentGroup(const char* description) SK_OVERRIDE; 100 virtual void addComment(const char* kywd, const char* value) SK_OVERRIDE; 101 virtual void endCommentGroup() SK_OVERRIDE; 102 103 protected: 104 virtual void willSave(SaveFlags) SK_OVERRIDE; 105 virtual SaveLayerStrategy willSaveLayer(const SkRect*, const SkPaint*, SaveFlags) SK_OVERRIDE; 106 virtual void willRestore() SK_OVERRIDE; 107 108 virtual void didConcat(const SkMatrix&) SK_OVERRIDE; 109 virtual void didSetMatrix(const SkMatrix&) SK_OVERRIDE; 110 111 virtual void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) SK_OVERRIDE; 112 virtual void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y, 113 const SkPaint&) SK_OVERRIDE; 114 virtual void onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[], 115 const SkPaint&) SK_OVERRIDE; 116 virtual void onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[], 117 SkScalar constY, const SkPaint&) SK_OVERRIDE; 118 virtual void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path, 119 const SkMatrix* matrix, const SkPaint&) SK_OVERRIDE; 120 virtual void onPushCull(const SkRect& cullRect) SK_OVERRIDE; 121 virtual void onPopCull() SK_OVERRIDE; 122 123 virtual void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE; 124 virtual void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE; 125 virtual void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE; 126 virtual void onClipRegion(const SkRegion&, SkRegion::Op) SK_OVERRIDE; 127 128 virtual void onDrawPicture(const SkPicture*) SK_OVERRIDE; 129 130 static const char* EdgeStyleToAAString(ClipEdgeStyle edgeStyle); 131 132 private: 133 Dumper* fDumper; 134 int fNestLevel; // for nesting recursive elements like pictures 135 136 void dump(Verb, const SkPaint*, const char format[], ...); 137 138 typedef SkCanvas INHERITED; 139 }; 140 141 /** Formats the draw commands, and send them to a function-pointer provided 142 by the caller. 143 */ 144 class SkFormatDumper : public SkDumpCanvas::Dumper { 145 public: 146 SkFormatDumper(void (*)(const char text[], void* refcon), void* refcon); 147 148 // override from baseclass that does the formatting, and in turn calls 149 // the function pointer that was passed to the constructor 150 virtual void dump(SkDumpCanvas*, SkDumpCanvas::Verb, const char str[], 151 const SkPaint*) SK_OVERRIDE; 152 153 private: 154 void (*fProc)(const char*, void*); 155 void* fRefcon; 156 157 typedef SkDumpCanvas::Dumper INHERITED; 158 }; 159 160 /** Subclass of Dumper that dumps the drawing command to SkDebugf 161 */ 162 class SkDebugfDumper : public SkFormatDumper { 163 public: 164 SkDebugfDumper(); 165 166 private: 167 typedef SkFormatDumper INHERITED; 168 }; 169 170 #endif 171 172 #endif 173