11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc. 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifndef SkDumpCanvas_DEFINED 90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#define SkDumpCanvas_DEFINED 100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkCanvas.h" 120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** This class overrides all the draw methods on SkCanvas, and formats them 140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project as text, and then sends that to a Dumper helper object. 154f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Typical use might be to dump a display list to a log file to see what is 170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project being drawn. 180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkDumpCanvas : public SkCanvas { 200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic: 210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project class Dumper; 220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project explicit SkDumpCanvas(Dumper* = 0); 240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual ~SkDumpCanvas(); 254f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project enum Verb { 270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kNULL_Verb, 280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kSave_Verb, 300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kRestore_Verb, 314f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kMatrix_Verb, 334f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kClip_Verb, 354f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kDrawPaint_Verb, 370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kDrawPoints_Verb, 380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kDrawRect_Verb, 390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kDrawPath_Verb, 400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kDrawBitmap_Verb, 410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kDrawText_Verb, 420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project kDrawPicture_Verb, 4393d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed kDrawVertices_Verb, 4493d11b5b461a8677a8e3ffa94260f4f9897070acMike Reed kDrawData_Verb 450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project }; 464f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /** Subclasses of this are installed on the DumpCanvas, and then called for 480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project each drawing command. 490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project class Dumper : public SkRefCnt { 510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project public: 520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void dump(SkDumpCanvas*, SkDumpCanvas::Verb, const char str[], 530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPaint*) = 0; 540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project }; 554f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Dumper* getDumper() const { return fDumper; } 570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void setDumper(Dumper*); 584f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 5979377cbceeea970b663e7934d7cb1f27bb223d98Mike Reed int getNestLevel() const { return fNestLevel; } 604f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual int save(SaveFlags) SK_OVERRIDE; 620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual int saveLayer(const SkRect* bounds, const SkPaint* paint, 631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SaveFlags) SK_OVERRIDE; 641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void restore() SK_OVERRIDE; 650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual bool translate(SkScalar dx, SkScalar dy) SK_OVERRIDE; 671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual bool scale(SkScalar sx, SkScalar sy) SK_OVERRIDE; 681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual bool rotate(SkScalar degrees) SK_OVERRIDE; 691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual bool skew(SkScalar sx, SkScalar sy) SK_OVERRIDE; 701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual bool concat(const SkMatrix& matrix) SK_OVERRIDE; 711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void setMatrix(const SkMatrix& matrix) SK_OVERRIDE; 724f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual bool clipRect(const SkRect&, SkRegion::Op, bool) SK_OVERRIDE; 741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual bool clipPath(const SkPath&, SkRegion::Op, bool) SK_OVERRIDE; 750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual bool clipRegion(const SkRegion& deviceRgn, 761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkRegion::Op) SK_OVERRIDE; 770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE; 790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void drawPoints(PointMode mode, size_t count, const SkPoint pts[], 801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkPaint& paint) SK_OVERRIDE; 811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void drawRect(const SkRect& rect, const SkPaint& paint) SK_OVERRIDE; 821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void drawPath(const SkPath& path, const SkPaint& paint) SK_OVERRIDE; 830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar top, 841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkPaint* paint) SK_OVERRIDE; 850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void drawBitmapRect(const SkBitmap& bitmap, const SkIRect* src, 861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkRect& dst, const SkPaint* paint) SK_OVERRIDE; 870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m, 881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkPaint* paint) SK_OVERRIDE; 890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void drawSprite(const SkBitmap& bitmap, int left, int top, 901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkPaint* paint) SK_OVERRIDE; 910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void drawText(const void* text, size_t byteLength, SkScalar x, 921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkScalar y, const SkPaint& paint) SK_OVERRIDE; 930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void drawPosText(const void* text, size_t byteLength, 941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkPoint pos[], const SkPaint& paint) SK_OVERRIDE; 950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void drawPosTextH(const void* text, size_t byteLength, 960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkScalar xpos[], SkScalar constY, 971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkPaint& paint) SK_OVERRIDE; 980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void drawTextOnPath(const void* text, size_t byteLength, 990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPath& path, const SkMatrix* matrix, 1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkPaint& paint) SK_OVERRIDE; 1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void drawPicture(SkPicture&) SK_OVERRIDE; 1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void drawVertices(VertexMode vmode, int vertexCount, 1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkPoint vertices[], const SkPoint texs[], 1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const SkColor colors[], SkXfermode* xmode, 1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const uint16_t indices[], int indexCount, 1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkPaint& paint) SK_OVERRIDE; 1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void drawData(const void*, size_t) SK_OVERRIDE; 1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate: 1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project Dumper* fDumper; 11179377cbceeea970b663e7934d7cb1f27bb223d98Mike Reed int fNestLevel; // for nesting recursive elements like pictures 1124f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void dump(Verb, const SkPaint*, const char format[], ...); 1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project typedef SkCanvas INHERITED; 1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Formats the draw commands, and send them to a function-pointer provided 1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project by the caller. 1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkFormatDumper : public SkDumpCanvas::Dumper { 1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic: 1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkFormatDumper(void (*)(const char text[], void* refcon), void* refcon); 1244f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // override from baseclass that does the formatting, and in turn calls 1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project // the function pointer that was passed to the constructor 1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project virtual void dump(SkDumpCanvas*, SkDumpCanvas::Verb, const char str[], 1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const SkPaint*) SK_OVERRIDE; 1294f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate: 1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void (*fProc)(const char*, void*); 1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void* fRefcon; 1334f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project typedef SkDumpCanvas::Dumper INHERITED; 1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project/** Subclass of Dumper that dumps the drawing command to SkDebugf 1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectclass SkDebugfDumper : public SkFormatDumper { 1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic: 1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkDebugfDumper(); 1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectprivate: 1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project typedef SkFormatDumper INHERITED; 1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 148