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