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